2011-04-21 51 views
3

我只是不明白爲什麼會發生這種情況。如果我創建兩個獨立的新PSObjects,它們似乎互相影響。例如,使用此代碼:有人可以解釋這個怪異的PSObject +添加成員Powershell的行爲?

$o1 = new-object psobject 
$o1 | add-member noteproperty abc 123 

$o2 = new-object psobject 
$o2 | add-member noteproperty def 456 

write-output $o1 
write-output $o2 

我希望看到輸出兩個ABC和閃避,但我只得到ABC:

abc 
--- 
123 

如果我使用write-host來代替,就像這樣:

write-host $o1 
write-host $o2 

然後,它示出了這樣的輸出:

@{abc=123} 
@{def=456} 

所以根據寫輸出,$ o2是空/空的,但寫主機說這是一個謊言。

發生了什麼事?

回答

5

如果您從控制檯運行樣本行,您將看不到任何問題。如果你在腳本中運行它們,你會看到一個問題。這是因爲Out-Default(位於每個管道的末端)將其格式化決定基於它所看到的第一個對象。所以你需要確保你輸出的不是一個以上的對象類型。或者如果你是這樣,你需要創建一些處理所有對象類型的格式規則(比如Get-ChildItem的目錄和文件輸出)。

+0

啊,當然!謝謝,這恰恰解釋了這個問題。 – scobi 2011-04-22 02:01:36

1

我無法重現您所看到的問題,但我確實注意到寫入輸出的格式化輸出顯示控制檯最右側的對象。我第一次看到它時實際上錯過了它。如果我管它格式列表我得到以下。

39 > $o1 = new-object psobject 
40 > $o1 | add-member noteproperty abc 123 
41 > $o2 = new-object psobject 
42 > $o2 | add-member noteproperty def 456 
43 > 
43 > write-output $o1 | fl 

abc : 123 

44 > write-output $o2 | fl 

def : 456 
5

如果在腳本中輸出多個不同的對象,則輸出的列取決於管道中的第一個項目。由於第一個PSObject只有一個abc屬性,第二個對象沒有輸出任何東西,因爲它沒有匹配的屬性。

P.S.如果一次執行一行,則不會看到此行爲。

相關問題