2011-04-21 9 views
3

なぜこれが起こっているのか分かりません。 2つの別々の新しいPSObjectを作成すると、互いに影響を与えるように見えます。たとえば、このコードで:誰かがこの奇妙な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とDEFの両方の出力を見ることを期待する、まだ私はABC取得:

abc 
--- 
123 

私はこのように、代わりに書き込みホストを使用する場合:

write-host $o1 
write-host $o2 

そして、それは、このような出力を示しています

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

write-outputによれば、$ o2は空/空ですが、write-hostはそれが嘘だと言います。

何が起こっているのですか?

答えて

5

コンソールからサンプル行を実行すると問題はありません。スクリプト内でそれらをすべて実行すると、問題が表示されます。これはOut-Default(すべてのパイプラインの終わりにある)が書式設定の決定を、最初に表示されるオブジェクトに基づいているためです。したがって、複数のオブジェクトタイプが出力されていないことを確認する必要があります。そうであれば、Get-ChildItemのディレクトリ出力やファイル出力のように、すべてのオブジェクトタイプを処理する書式設定ルールを作成する必要があります。

+0

ああ、もちろん!ありがとう、これは正確に問題を説明します。 – scobi

1

表示されている問題を再現できませんが、書き込み出力の書式設定された出力がコンソールの右端にあるオブジェクトを表示しています。私は実際にそれを見逃した。私がformat-listにパイプすると、次のようになります。

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プロパティしか持っていなかったので、2番目のオブジェクトは一致するプロパティを持たないので何も出力しませんでした。

P.S.一度に1行ずつ実行すると、この動作は表示されません。