我有一个用于多级查找表的数据结构,看起来像这样
$lookupTable = @{
'a' = @{
'a1' = 'A One'
'a2' = 'A Two'
'a3' = 'A Three'
}
'b' = @{
'b1' = 'B One'
'b2' = 'B Two'
'b3' = 'B Three'
}
}
我使用像这样的数据结构来传递任意数量的新值和修改后的值,以更新表。
$hash=@{'a'=@{'a4'='A Four'}
'b'=@{'b4'='B Four'}
'c'=@{'c1'='C One'
'c2'='C Two'
}
}
然后,我可以使用嵌套的foreach循环来获取要添加或更新的键名。
但是,我也只需要提取一个值,并且我想保持类似的数据结构,因此我可以仅传递一个哈希表来确切指定我要查找的值,例如$getValue = @{'b'='b1'}
。
但是要做到这一点,我需要在第一个(唯一的)索引处获取键名。我尝试过
Write-Host "$($getValue.GetEnumerator[0])"
Write-Host "$($getValue.keys.GetEnumerator[0])"
Write-Host "$($getValue.GetEnumerator[1])"
Write-Host "$($getValue.keys.GetEnumerator[1])"
,没有任何作用。我可以再次使用一个foreach,它只会出现一次,但这看起来并不优雅。那么,我在做什么错了?
编辑:只是为了验证基于循环的方法是否有效,我做到了
foreach ($key in $getValue.keys) {
if ($key) {
Write-Host "$key $($getValue.$key) = $($lookupTable.$key.($getValue.$key))"
}
break
}
确实返回b b1 = B一。但这是一种丑陋的方式。
党,越来越近了!
$key = $getValue.keys[0]
确实提供了键 b 。但是$value = $getValue.$key
没有返回预期的 b1 。但是,$value = $getValue[$key]
确实可以!但是,然后尝试
$ key = $ getValue.keys [0]
$ value = $ getValue [$ key]
Write-Host "$key $($getValue[$key]) = $($lookupTable.$key.$value)"
不会返回实际的最终值。 r再喝咖啡,然后重试。
啊! $ getValue.keys [0]不返回字符串。但是,如果将字符串转换为字符串,那么一切都会变得很花哨。所以
$key = [string]$getValue.keys[0]
$value = $getValue.$key
Write-Host "$key $value = $($lookupTable.$key.$value)"
请客。所以我回答了我自己的问题。我想我会让mods决定这对其他人是否有教育意义,还是应该删除它。
答案 0 :(得分:0)
我认为您可以通过声明$getValue
而不是作为哈希表,而是声明为简单数组来简化此操作:
# define the value to get as array of keys.
# Element 0 => the key for $lookupTable,
# Element 1 => the key for the first nested hash
$getValue = 'b','b1'
# now, simply get the value you are looking for like this:
Write-Host $lookupTable[$getvalue[0]][$getValue[1]]
# or like so:
Write-Host $lookupTable.$($getvalue[0]).$($getvalue[1])
# or by using helper variables:
$lookupKey, $nestedKey = $getValue
Write-Host $lookupTable.$lookupKey.$nestedKey
以上所有内容将返回值B One