2017-07-29 37 views
3

当使用UNC路径(例如:\\machine\share\dir)时,我可以在使用时获取文件列表dir命令(Get-ChildItem)从一个UNC路径,但如果我尝试[System.IO.Directory]::GetFiles,我得到一个空列表(不是错误,只是没有项目)。我认为PS是建立在.NET框架之上的。有谁知道为什么Get-ChildItem可以使用UNC路径,而.NET GetFiles方法返回空列表?Get-ChildItem与使用UNC路径直接使用.NET Framework的[System.IO.Directory] ​​:: GetFiles()方法

+2

GetFileSystemEntries方法将是您正在寻找的模拟。另外,区别在于NET类更快,尤其是UNC部分。 – wOxxOm

回答

3

[System.IO.Directory]::GetFiles()只返回文件,而Get-ChildItem(和它的内置别名dir)默认返回这两个文件目录。

因此,呼吁有子目录只(不文件)目录[System.IO.Directory]::GetFiles()产生“无中生有”(空字符串数组))。

把它的另一种方式,松散说:Get-ChildItem工会的[System.IO.Directory]::GetFiles()(类似于Get-ChildItem -File,PSv3 +)和[System.IO.Directory]::GetDirectories()(类似于Get-ChildItem -Directory,PSv3 +),或者更直接地说,对口[System.IO.Directory]::GetFileSystemEntries()

另一种选择是使用.NET 4+(可在PSv3 +中使用)文件系统 - 项目枚举 API,例如[System.IO.Directory]::EnumerateFileSystemInfos()。有关示例,请参阅我的this answer

Get-ChildItem和直接使用[System.IO.Directory]类型之间存在许多具体差异,但是,值得注意的是该Get-ChildItem回报对象而不是字符串和Get-ChildItem跳过隐藏项目在默认情况下(-Force必须使用)。

通常,使用PowerShell自己的cmdlet和直接使用.NET Framework进行选择是便利和性能之间的折中。
后者通常会更快,并且在案例中,PowerShell版本1和2中的UNC路径尤其如此 - 请参阅this blog post

有关补充信息,请参考wOxxOmMike Sherrill 'Cat Recall'

+1

谢谢,@ MikeSherrill'CatRecall' - 我已将您的提示纳入答案。 – mklement0