2016-08-03 84 views
2

不確定「放氣」是否正確,但我想知道是否有更好的方法來指定您只想返回對象的兒童屬性選擇,同時使用Select-Object?我正在使用Powershell v5。Powershell:兒童財產通貨緊縮

下面是一個完整的工作示例 - $test變量在此處進行硬編碼用於演示目的;在我的用例中,$test數組正在從API返回。我想在投影期間從testChild對象中刪除name屬性。

我可以想出如何做到這一點的唯一方法是使用foreach循環,然後管道到$result,然後重新創建每個子對象並只設置所需的屬性,但感覺像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