Powershell有时会以不同方式输出目录路径

时间:2013-07-17 13:50:54

标签: powershell powershell-v3.0

我正在使用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

2 个答案:

答案 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上的文档(dirls都是别名)。