1

ls用来按约定查找目录。它的工作原理是找到它们,但我将结果传递给其他函数。取决于dir调用“ls”(又名:)的方式。为什么会这样?

C:\tmp40D4> ls *_Pkg -Recurse | %{"$_"}
C:\tmp40D4\sub\A_Pkg
C:\tmp40D4\sub\B_Pkg
C:\tmp40D4\sub\C_Pkg

C:\tmp40D4> ls sub *_Pkg -Recurse | %{"$_"}
A_Pkg
B_Pkg
C_Pkg

两个结果都是 DirectoryInfo 实例的列表。

C:\tmp40D4> ls sub *_Pkg -Recurse | %{$_.GetType()}

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo
True     True     DirectoryInfo                            System.IO.FileSystemInfo
4

2 回答 2

2

事实证明,替代调用提供的 DirectoryInfo 实例会ls导致不同的 DirectoryInfo 实例。具体来说,

ls sub *_Pkg -Recurse | %{ [io.path]::IsPathRooted($_) }将导致

False
False
False

ls *_Pkg -Recurse | %{ [io.path]::IsPathRooted($_) }将导致

True
True
True

重要的是要记住ls实际上并没有显示任何内容。"$_"in是等同于%{ "$_" }的简写。write-host $_write-host $_.ToString()

所以事实证明,非根目录信息上的 ToString() 将只产生,而Name目录上的 ToString()将使用.FullName

于 2013-07-17T15:14:01.980 回答
1

从某种意义上说,它似乎dir很聪明,它试图用相对路径向您显示,但仅在微不足道的情况下。

您可以始终通过使用强制使用绝对路径-Include *。在你的情况下:

ls sub *_Pkg -Include * -Recurse | %{"$_"}

有关详细信息,请参阅Get-ChildItem Cmdletdir文档(两者ls都是别名)。

于 2013-07-17T13:59:50.980 回答