2014-02-24 76 views
1

首先,這裏是我的代碼:ErrorVariable輸出並不如預期

$InputPath = "\\Really\long\path\etc" 
Get-ChildItem -Path $InputPath -Recurse -Force -ErrorVariable ErrorPath 
$ErrorPath | select TargetObject 

我面臨的問題是與ErrorVariable參數。 Get-ChildItem要處理的路徑太長(通常大約250個字符)。當我管$ ErrorPath選擇,輸出看起來是這樣的:

TargetObject : \\Really\long\path\etc\1 

TargetObject : \\Really\long\path\etc\2 

TargetObject : \\Really\long\path\etc\3 

但是,如果我跑最後一行再次(可以通過運行選擇或通過手動鍵入它),則輸出變爲這樣:

TargetObject 
------------ 
\\Really\long\path\etc\1 
\\Really\long\path\etc\2 
\\Really\long\path\etc\3 

我不知道該如何解釋。我更喜歡第二個輸出,但我不知道爲什麼它從第一次到第二次不同。有任何想法嗎?

回答

2

當有多個類型的對象在一管道中的第一對象類型確定用於其餘對象的格式。如果您在命令提示符下單獨運行命令,則不會看到這一點。每一行開始一個新的管道。但是,當您在腳本中運行這些命令時,整個腳本將作爲管線執行。要解決此問題,請使用Out-Default例如:

$InputPath = "\\Really\long\path\etc" 
Get-ChildItem $InputPath -Recurse -Force -ErrorVariable ErrorPath 
$ErrorPath | select TargetObject | Out-Default 
0

前一個輸出是列表格式,後者是表格格式。可以強制一個或另一個通過分別管道數據到Format-ListFormat-Table的cmdlet:

PS C:\>$ErrorPath | select TargetObject | Format-List 


TargetObject : \\Really\long\path\etc\1 

TargetObject : \\Really\long\path\etc\2 

TargetObject : \\Really\long\path\etc\3 


PS C:\>$ErrorPath | select TargetObject | Format-Table 

TargetObject 
------------ 
\\Really\long\path\etc\1 
\\Really\long\path\etc\2 
\\Really\long\path\etc\3
+0

但爲什麼會發生變化?當我執行兩次相同的命令時,它不應該總是這樣嗎? –