如何查询Hashtable嵌套属性?求无需迭代提取Bar属性数组的方法
获取嵌套哈希表中所有Bar属性的数组(PowerShell)
当然有更简洁的实现方式!你当前的嵌套循环虽然能达成目标,但PowerShell的原生特性可以帮你彻底省去手动迭代的麻烦,下面给你几种实用的解决方案:
1. 最简洁:直接使用成员访问语法
PowerShell支持对集合的批量成员访问,无需任何循环或管道,一行就能搞定:
$ht.Values.Bar
原理:
$ht.Values会返回哈希表中所有内层哈希表的集合(也就是@{Bar="Baz"; Qux="Quux"}和@{Bar="Corge"; Qux="Grault"})- 直接对这个集合访问
.Bar,PowerShell会自动遍历每个元素提取Bar属性,最终返回一个包含所有值的数组。
2. 管道+ForEach-Object(可读性强)
如果你更习惯管道风格的写法,可以用GetEnumerator()配合ForEach-Object:
$ht.GetEnumerator() | ForEach-Object { $_.Value.Bar }
原理:
GetEnumerator()获取哈希表的键值对枚举器,每个枚举项包含Key(外层键名,比如Foo、Quuz)和Value(内层哈希表)- 通过
ForEach-Object遍历每个枚举项,直接提取Value中的Bar属性,最终自动收集为数组。
3. 结合Select-Object的实现(呼应你提到的思路)
如果你想用Select-Object来处理,可以先展开内层哈希表,再提取属性:
($ht.GetEnumerator() | Select-Object -ExpandProperty Value).Bar
或者用计算属性的方式:
$ht.GetEnumerator() | Select-Object @{Name='Bar'; Expression={$_.Value.Bar}} | Select-Object -ExpandProperty Bar
原理:
- 第一种写法先通过
-ExpandProperty Value提取所有内层哈希表,再批量访问.Bar属性 - 第二种写法用计算属性先定义
Bar字段,再通过-ExpandProperty把字段值展开为数组。
顺便优化你原来的代码
其实你原来的内层循环是多余的,$i已经是哈希表的键值对枚举项,直接访问$i.Value.Bar即可,简化后:
$arr = @() foreach ($entry in $ht.GetEnumerator()) { $arr += $entry.Value.Bar }
不过显然还是前面几种方法更高效简洁。
内容的提问来源于stack exchange,提问作者Tiamo Idzenga
相关产品推荐
相关产品推荐

