PowerShell按嵌套字段选择和分组

时间:2016-10-13 21:39:17

标签: powershell

我有以下对象结构:

  • 资源(数组)
    • 资源(PSCustomObject)
      • 名称(字符串)
      • 标签(PSCustomObject)
        • 所有者(字符串)
      • 更多...

所以我可以select获取字符串值。

目标是group只是姓名和所有者,然后是所有者$resources | select {$_.Tags.Owner, $_.Name}

我可以group,但后来我得到了一个新的PSCustomObject数组,其中包含两个成员“$ .Tags.Owner”和“$ .Name”。 如何通过名为“$ _。Tags.Owner”的字段来创建组?

  1. 我可以将“$ _。Tags.Owner”重命名为更友好的名称和组吗?
  2. 我能以某种方式告诉{{1}}我的意思是“$ _。Tags.Owner”字面而不是对象层次结构吗?

1 个答案:

答案 0 :(得分:1)

解决方案:

#Demo Data Setup
Clear-Host
[PSCustomObject[]]$resources = @(
    [PSCustomObject]@{Name='One';Tags=[PSCustomObject]@{Owner='Anne'}}
    [PSCustomObject]@{Name='Two';Tags=[PSCustomObject]@{Owner='Bob'}}
    [PSCustomObject]@{Name='Three';Tags=[PSCustomObject]@{Owner='Claire'}}
    [PSCustomObject]@{Name='Four';Tags=[PSCustomObject]@{Owner='Anne'}}
    [PSCustomObject]@{Name='Five';Tags=[PSCustomObject]@{Owner='Bob'}}
)


#Solution
$resources | Select-Object Name, @{Name='Owner';Expression={$_.Tags.Owner}} | Group-Object -Property Owner

#Or a more verbose option which may be better in other scenarios
$resources | ForEach-Object {
    $Name = $_.Name
    $_.Tags | Select-Object Owner, @{Name='Name';Expression={$Name}} 
} | Group-Object -Property Owner

说明:

  • $resources - 将资源数组传递到管道
  • Select-Object - 对于每个资源,返回从该资源派生的属性集合
  • Name - 取名称属性
  • @{Name='Owner';Expression={$_.Tags.Owner}} - 创建一个名为Owner的新属性,其值为当前资源的标签'物业的所有者。
  • Group-Object - 将管道中的所有属性组合在一起
  • -Property Owner - 在所有者属性中拥有相同值的组中。