我正在使用ls
按惯例查找目录。它的工作原理是找到它们,但我将结果传递给其他函数。取决于'ls'(aka: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
答案 0 :(得分:2)
事实证明,从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()
。
事实证明,非rooted DirectoryInfo上的ToString()只会导致Name
,而 rooted 上的ToString()将使用FullName
。
答案 1 :(得分:1)
似乎dir
似乎是聪明的,它试图用相对路径显示你,但只是在琐碎的情况下。
您可以使用-Include *
始终强制使用绝对路径。在你的情况下:
ls sub *_Pkg -Include * -Recurse | %{"$_"}
有关详细信息,请参阅Get-ChildItem Cmdlet上的文档(dir
和ls
都是别名)。