2013-04-04 52 views
4

我在寫一個Powershell cmdlet來列出TFS中的變更集。我成功地查詢了TFS並獲取了一組變量集,但想要返回僅包含少數屬性的簡化對象。我能做到這一點使用Select-Object這樣的...嵌套集合上的Select-Object

$changesets | Select-Object ChangeSetId, Owner, Comment 

最後一個屬性我想補充的是Changes財產是變化的數組。我想簡化這些對象。我想這一點,但它不返回我想要什麼......

$changesets | Select-Object ` 
    ChangeSetId, 
    Owner, 
    Comment, 
    @{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }} 

有沒有一種方法來處理嵌套集合與Select-Object

回答

7

你可以使用Select-Object cmdlet的-ExpandProperty參數。它將展開收集並將選定的屬性從父對象添加到子對象:

$changesets | Select-Object ChangeSetId, Owner, Comment, 
    @{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }} | 
Select-Object -Property * -ExcludeProperty Changes -ExpandProperty Changes 
+1

清晰的語法,令人沮喪的語言。像這樣的例子傷害了我的眼睛。 – 2017-09-26 23:17:29

4

我可能會展開內部集合中的每個項目的內部集合和輸出一次。像這樣的東西(未測試):

$changesets | foreach-object { 
    $changeSetItem = $_ 
    $changeSetItem.Changes | foreach-object { 
    $changeItem = $_ 
    new-object PSObject -property @{ 
     "ChangeSetId" = $changeSetItem.ChangeSetId 
     "Owner" = $changeSetItem.Owner 
     "Comment" = $changeSetItem.Comment 
     "ChangeType" = $changeItem.ChangeType 
     "ServerItem" = $changeItem.ServerItem 
    } 
    } 
} 

比爾

3

你的表達式語法是不完全正確,你需要表達和代碼塊之間的等號(「=」)。

$changesets | Select-Object ` 
ChangeSetId, 
Owner, 
Comment, 
@{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }} 

如果你想嵌套的對象是一個頂級元素前進,你也可以做......

$changesets | Select-Object ` 
ChangeSetId, 
Owner, 
Comment, 
@{Name="ChangeType"; Expression={ $_.Changes.ChangeType}}, 
@{Name="ServerItem"; Expression={ $_.Changes.ServerItem }}