2013-07-17 53 views
1

我使用ls按慣例查找目錄。它的工作原理是找到它們,但我將結果輸送到其他功能。取決於'ls'(又名:dir)的調用方式。這是爲什麼發生?Powershell輸出目錄路徑的方式有時會有所不同

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

我的理解是:「ls」是「get-childitem」的別名。當您處於「tmp40D4」下時,它會顯示完整路徑(絕對路徑),因爲* _pkg文件不是您目前所在目錄的「子」。但是當你指定「sub」時,它們都顯示相對路徑,因爲在這種情況下* _pkg文件是「sub」目錄的「子」。 – Peter

+0

如果你想在第二個命令的絕對路徑,你可以這樣:'ls sub * _Pkg -Recurse | %{「$ _。Fullname」}' – Peter

+0

@Peter我實際上並不屬於sub。我使用sub作爲ls的路徑。 「$ _」只是在默認情況下委託給寫主機,所以它與構造的DirectoryInfo實例有所不同。我覺得很奇怪。 –

回答

1

好像dir是在這個意義上的智能,它試圖通過相對路徑來顯示你的,但只有在瑣碎的案件。

您可以始終使用-Include *來強制使用絕對路徑。你的情況:

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

欲瞭解更多信息,請參閱Get-ChildItem Cmdlet文件(用於這兩個dirls是別名)。

+0

我不認爲DirectoryInfo項目本身可能會有所不同 –

+1

@jsalonen試圖給你一種方法來檢索「$ _。Fullname」。原始問題中錯過的是「$ _。Name」和「$ _。Fullname」之間的區別。談論路徑,有時使用「$ _。Name」時可能會遇到一些麻煩。但是如果你使用「$ _。Fullname」,你永遠不會遇到麻煩。 – Peter

+0

你能解釋更多爲什麼 - 在'Write-Host'$ _「'輸出完全限定的FullName中包含*結果?我發現這個基於該參數描述的奇怪:http://technet.microsoft.com/library/hh849800.aspx –

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()

所以事實證明,toString()方法上無根的DirectoryInfo將導致在剛剛Name,其中,爲的ToString()在紮根將使用FullName

+0

我喜歡這種方法。我相信無論您獲取全名還是名稱都來自「get-chileitem」(ls)cmdlet根據給定的不同參數情況調用的方式。 – Peter

相關問題