2016-08-03 8 views
2

"deflating"が正しい用語であるかどうかわかりませんが、Select-Objectを使用している間にオブジェクトの子供のプロパティの選択のみを返すように指定する方が良いかどうか疑問に思っていましたか?私はPowershell v5を使用しています。Powershell:Child Property Deflation

ここでは完全に動作する例を示します。$test変数はデモンストレーション目的でハードコードされています。私の場合、$test配列がAPIから返されています。投影中にnameプロパティをtestChildオブジェクトから削除したいとします。

これを行う方法を理解できる唯一の方法は、$resultにパイプしながらforeachループを使用して、各子オブジェクトを再作成し、必要なプロパティのみを設定することですが、powershellの方がこれを行う。

$test = @(
    [PSCustomObject]@{ 
     testProp = "test1" 
     testChild = [PSCustomObject]@{ 
      id = 1 
      name = "test name 1" 
     } 
    }, 
    [PSCustomObject]@{ 
     testProp = "test2" 
     testChild = [PSCustomObject]@{ 
      id = 2 
      name = "test name 2" 
     } 
    } 
) 

$result = $test | select testProp, testChild | % { 
    $_.testChild = [PSCustomObject]@{ 
     id = $_.testChild.id 
    } 
    $_ 
} 

$result 

この出力:

私がしたい正確に何である
testProp testChild 
-------- --------- 
test1 @{id=1} 
test2 @{id=2} 

。 - 私は私が含ま指定/プロパティのみ削除いくつかのプロパティを持つ元のオブジェクトをしたい、私はフラットな特性が返されたくない心の中で

$result = $test | select testProp, testChild.id 

ベアリング:私はこのような何かを行うことができれば、私はいいと思います。

答えて

4

あなたはSelect-Objectでこれを行うことができます。

$result = $test | select testProp, @{ 
    Name = 'id' 
    Expression = { $_.testChild.id } 
} 

基本的には、Select-Objectはあなたが値を式([ScriptBlock])によって決定され、独自のプロパティを定義することができますので、あなたは、任意のコードを実行することができますあなたは値を決定したいと思う。ブロック内の$_は、ForEach-Object呼び出しと同じ方法で、「現在のオブジェクト」を参照します。

+0

ありがとうございました。それでも、私の使用例では、実際には/より多くの/コードを生成しています(主に私がいくつかのプロパティの配列を操作しているため)。他に誰もいなくなったら、これを受け入れるよ! – Spikeh

+0

実際、あなたの答えは私が指定したものではありません - フラットな 'id'プロパティを返しました。それは私の例のようにオブジェクトである必要があります。 – Spikeh

+0

@Spikehあなたは式を独自の 'Select-Object'ステートメントにすることができます。ステートメントはオブジェクトを保持します。あるいは、以前と同じように式を直接[PSObject]にすることができます。いくつかの方法がありますが、あなたが望む正確な結果を直接与えるものは何もありません – briantist