PowerShell中如何遍历多维哈希表并访问所有键?
解决PowerShell多维哈希表遍历所有键的问题
嘿,我来帮你搞定这个嵌套哈希表遍历的问题!先拆解下你的哈希表结构,它是多层嵌套的:
$ou = @{ class = @{ value1 = @{ 1 = "" } value2 = "" value3 = "" } }
顶层哈希表有一个键class,对应的值又是一个哈希表,里面包含你要找的value1、value2、value3,甚至value1还嵌套了更深的哈希表。
先搞定固定两层嵌套的情况
你之前的问题出在没有正确获取嵌套的哈希表对象。你写的$key.keys里的$key其实是顶层的键字符串(比如class),不是哈希表对象,自然没法拿到内层的键。正确的两层遍历写法如下:
# 遍历顶层哈希表的键 foreach ($topKey in $ou.Keys) { # 拿到顶层键对应的嵌套哈希表 $innerHash = $ou[$topKey] # 遍历内层哈希表的所有键 foreach ($innerKey in $innerHash.Keys) { Write-Host "内层键: $innerKey" } }
运行这段代码就能输出你要的value1、value2、value3了。
通用递归遍历(支持任意多层嵌套)
如果你的哈希表可能有更深的嵌套(比如value1里的1这个键),手动加多层循环显然不灵活,这时候用递归函数就完美解决:
function Get-AllHashKeys { param( [Parameter(Mandatory=$true)] [hashtable]$Hash ) foreach ($key in $Hash.Keys) { # 输出当前找到的键 Write-Host "找到键: $key" # 检查当前键对应的值是否还是哈希表,如果是,递归遍历下一层 if ($Hash[$key] -is [hashtable]) { Get-AllHashKeys -Hash $Hash[$key] } } } # 调用函数遍历你的哈希表 Get-AllHashKeys -Hash $ou
这段代码会遍历所有层级的键,输出结果是:
找到键: class 找到键: value1 找到键: 1 找到键: value2 找到键: value3
关于你之前的疑惑
你提到$key.keys返回奇怪的内容,是因为$key是字符串类型(比如顶层的class),字符串本身并没有Keys属性。PowerShell的成员访问会做一些隐式处理,导致返回了不符合预期的内容。你需要先通过$ou[$key]获取到对应的哈希表对象,再访问它的Keys属性才行。
内容的提问来源于stack exchange,提问作者Louis J.
相关产品推荐
相关产品推荐

