2

複数のデータセットを返そうとしているオブジェクトのコレクションがあります。オブジェクトのプロパティの1つを選択して、一意に並べ替えるたびに。

私が得ている問題は、コレクションを初めて使用したときにのみ結果が得られることです。これにより、オブジェクトをパイプラインに配置したときに、オブジェクトが「消費」されているのかどうか疑問に思います。

例を挙げて説明します。

$results = getMyCollectionOfObjects

$results | select-object property1 | sort-object -unique property1
$results | select-object property2 | sort-object -unique property2
$results | select-object property3 | sort-object -unique property3

私が知る限り、これにより、3つのプロパティのそれぞれについて可能なすべての値の3つの異なるリストが作成されるはずです。

ただし、私にとっては、$results値が最初に選択されたときに「使い果たされている」ようです。

これは事実であり、代わりに何をすべきですか?

これが明確であることを願っています。

4

2 に答える 2

3

それが転がり方です...その奇妙な動作を取り除くために、それらを明示的に Out-Default にパイプする必要があります。それ以外の場合は、2 番目と 3 番目のセットの property1 も表示しようとします。$results から削除したため、空白に戻ります。

HTH バーテック

于 2012-05-17T01:45:11.230 に答える
3

それで、これは私がつまずいて、頭をかいてしまった. 結局のところ、答えは非常に単純です。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 は、次のステートメントに渡すのではなく、実際に強制的にコンソールに表示するために必要です。インタラクティブ シェルでステートメントを完了すると、この動作が暗示されるように見えますが、完全にスクリプト化すると、動作が少し異なります。

于 2012-05-17T04:03:29.133 に答える