Get-ChildItem 与直接使用 .NET Framework 的 [System.IO.Directory]::GetFiles() 方法和 UNC 路径

Dwe*_*rly 4 .net filesystems powershell

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

mkl*_*nt0 7

[System.IO.Directory]::GetFiles()仅返回files,而Get-ChildItem(及其内置别名dir)默认情况下返回文件目录。

因此,调用仅具有子目录(无文件[System.IO.Directory]::GetFiles())的目录不会产生“任何内容”(空字符串数组)。

另一种说法,宽松地说:Get-ChildItem是(类似于, PSv3+) 和(类似于, PSv3+)的并集,或者更直接地说,是 的对应项。[System.IO.Directory]::GetFiles()Get-ChildItem -File[System.IO.Directory]::GetDirectories()Get-ChildItem -Directory[System.IO.Directory]::GetFileSystemEntries()

另一种选择是使用 .NET 4+(在 PSv3+ 中提供)文件系统项枚举API,例如[System.IO.Directory]::EnumerateFileSystemInfos(). 例如,请参阅我的这个答案。

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

通常,在使用 PowerShell 自己的 cmdlet 和直接使用 .NET Framework 之间进行选择是在便利性和性能之间进行权衡。
后者通常会更快,在当前情况下,对于 PowerShell 版本 1 和 2 中的 UNC 路径尤其如此 - 请参阅此博客文章

向wOxxOmMike Sherrill 'Cat Recall'致敬以获取补充信息。