我有以下对象结构:
所以我可以select
获取字符串值。
目标是group
只是姓名和所有者,然后是所有者$resources | select {$_.Tags.Owner, $_.Name}
。
我可以group
,但后来我得到了一个新的PSCustomObject数组,其中包含两个成员“$ .Tags.Owner”和“$ .Name”。
如何通过名为“$ _。Tags.Owner”的字段来创建组?
答案 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
- 在所有者属性中拥有相同值的组中。