powershell - 获取一个成员哈希表中的键名
问题描述
我有一个看起来像这样的多级查找表的数据结构
$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 one 返回。但这是多么丑陋的做法。
唐,越来越近了!
$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)"
没有返回实际的最终值。Grr。更多的咖啡,然后再试一次。
啊哈!$getValue.keys[0] 不返回字符串。但是如果你转换成一个字符串,那么一切都是花花公子。所以
$key = [string]$getValue.keys[0]
$value = $getValue.$key
Write-Host "$key $value = $($lookupTable.$key.$value)"
工作一种享受。所以我回答了我自己的问题。我想我会让模组决定这是否对其他人有教育意义,或者应该被删除。
解决方案
我认为您可以通过将其声明$getValue
为 Hashtable 而不是简单的数组来简化这一点:
# 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
推荐阅读
- java - 从另一个包调用受保护的方法?
- python - 如何使用循环编写此代码(这是井字游戏代码 - 通过返回角色来确定游戏的获胜者)
- java - 如何识别当前标题的超(父)标题级别
- c# - 如何摆脱 asp.net mvc 中的重复项?
- symfony - 一个非常简单的 OneToOne 加入请求的教义错误
- javascript - 隐藏值低于特定值的类别 Highcharts
- openlayers - 如何将鼠标滚轮缩放级别限制为 View.resolutions 中指定的级别?
- hdfs - Apache Beam 中 HDFS 集群的附加配置
- java - 通过 RestAssured 在 JSON 中的多个匹配断言
- javascript - 验证消息隐藏在角度js中