それで、これは私がつまずいて、頭をかいてしまった. 結局のところ、答えは非常に単純です。Select-Object コマンドレットは、type のオブジェクトを返しますSelected.System.Management.Automation.PSCustomObject。その後、パイプラインを下って次の 2 つの選択に渡されますが、一致するプロパティがなくなったため (最初の選択から破棄されたため)、何も出力されません。次の例を検討してください。
# declare an array and populate it
$results = @()
$results = $results + (New-Object PSobject -Property @{
P1 = "One"
P2 = "Two"
P3 = "Three"
})
$results = $results + (New-Object PSobject -Property @{
P1 = "Uno"
P2 = "Dos"
P3 = "Tres"
})
$results | select P1
$results | select P2
$results | select P3
あなたが説明したように、私は最初の選択からのみ出力を得ていました。私は BartekB から提案を受けて、各行| Out-Defaultの最後に配置し、それが機能し始めました。| Get-Memberパイプラインに配置されていたオブジェクトを表示するために、それを置き換えてさらに調査しました。
$results | select -Property P1 | get-member
TypeName: Selected.System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
Equals Method bool Equals(System.Object obj)
GetHashCode Method int GetHashCode()
GetType Method type GetType()
ToString Method string ToString()
P1 NoteProperty System.String P1=One
簡単に言うと、Out-Default は、次のステートメントに渡すのではなく、実際に強制的にコンソールに表示するために必要です。インタラクティブ シェルでステートメントを完了すると、この動作が暗示されるように見えますが、完全にスクリプト化すると、動作が少し異なります。