如何用表达式扁平化嵌套PowerShell对象并精准过滤指定项?
PowerShell嵌套对象扁平化与过滤问题解决
首先给出原始嵌套对象定义:
$nested=[pscustomobject]@{set="A"; lst=[pscustomobject]@{Id=1; Name="One"},[pscustomobject]@{Id=2; Name="Two"}} ` , [pscustomobject]@{set="B"; lst=[pscustomobject]@{Id=1; Name="One"},[pscustomobject]@{Id=3; Name="Three"}}
一、实现扁平化列表
无需过程式循环结构,可通过ForEach-Object结合Select-Object的计算属性实现扁平化:
$nested | ForEach-Object { $currentSet = $_.set $_.lst | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name }
执行后会直接输出目标扁平化结果:
Set Id Name --- -- ----- A 1 One A 2 Two B 1 One B 3 Three
原理是遍历每个顶层对象,提取当前set值,再将lst中的每个子对象与set值组合成新对象,完成扁平化。
二、过滤指定条目
你之前的写法会返回整个包含符合条件子对象的顶层对象,原因是$_.lst.Id是数组,只要数组中有一个元素满足-eq 2,整个顶层对象就会被保留。正确的做法是先扁平化(或在展开时过滤),再筛选目标条目:
方法1:先扁平化再过滤
$nested | ForEach-Object { $currentSet = $_.set $_.lst | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name } | Where-Object { $_.Id -eq 2 -and $_.Name -eq 'Two' }
方法2:展开时直接过滤
$nested | ForEach-Object { $currentSet = $_.set $_.lst | Where-Object { $_.Id -eq 2 -and $_.Name -eq 'Two' } | Select-Object @{Name='Set'; Expression={$currentSet}}, Id, Name }
两种方法都会输出你需要的结果:
Set Id Name --- -- ----- A 2 Two
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

