嵌套集合上的Select-Object

cod*_*ion 5 powershell tfs

我正在编写一个Powershell cmdlet来列出来自TFS的更改集.我成功查询TFS并获取变更集的集合,但希望返回仅包含少量属性的简化对象.我可以这样使用Select-Object......

$changesets | Select-Object ChangeSetId, Owner, Comment
Run Code Online (Sandbox Code Playgroud)

我想要添加的最后一个属性是Changes属性,它是一组更改.我也希望简化这些对象.我正在尝试这个,但它不会返回我想要的东西......

$changesets | Select-Object `
    ChangeSetId,
    Owner,
    Comment,
    @{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }}
Run Code Online (Sandbox Code Playgroud)

有没有办法处理嵌套集合Select-Object

use*_*407 17

您可以使用cmdlet的-ExpandProperty参数Select-Object.它将展开集合并将父对象中的选定属性添加到子对象:

$changesets | Select-Object ChangeSetId, Owner, Comment,
    @{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }} |
Select-Object -Property * -ExcludeProperty Changes -ExpandProperty Changes
Run Code Online (Sandbox Code Playgroud)

  • 语法清晰,语言令人沮丧.像这样的例子伤害了我的眼睛. (3认同)

Dja*_*rid 7

您的表达式语法不太正确,您需要在表达式和代码块之间使用等号 ("=")。

$changesets | Select-Object `
ChangeSetId,
Owner,
Comment,
@{Name="Changes"; Expression={ $_.Changes | Select-Object ChangeType, ServerItem }}
Run Code Online (Sandbox Code Playgroud)

如果您希望嵌套对象成为未来的顶级元素,您也可以这样做...

$changesets | Select-Object `
ChangeSetId,
Owner,
Comment,
@{Name="ChangeType"; Expression={ $_.Changes.ChangeType}},
@{Name="ServerItem"; Expression={ $_.Changes.ServerItem }}
Run Code Online (Sandbox Code Playgroud)


Bil*_*art 5

我可能会为内部集合中的每个项目展开内部集合并输出一次。像这样的东西(未测试):

$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
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

账单