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

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

最佳答案

事实证明,从对ls的替代调用提供的DirectoryInfo实例导致了不同的DirectoryInfo实例。特别,
ls sub *_Pkg -Recurse | %{ [io.path]::IsPathRooted($_) }将导致

False
False
False

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

重要的是要记住,ls实际上并未显示任何内容。 "$_"中的%{ "$_" }write-host $_的简写,等效于write-host $_.ToString()

因此,事实证明,上没有根目录的 DirectoryInfo上的ToString()只会生成Name,而上有根目录的上的ToString()将使用FullName

关于powershell - Powershell有时输出目录路径的方式有所不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17701622/

10-15 13:52