我有一个哈希表,根据值使用Keys。
对于前。
$ComponentTobeBuild=@{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
我想获得值为True的键。 (我将把密钥传递给其他一些脚本作为参数)。
我是这样尝试的,但我认为我错过了一些因为它没有列出键。
$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }
如何获取表示为True的组件名称?此外,我想知道哈希表是否是这种工作的明智选择。因为我认为哈希表主要用于处理值。
答案 0 :(得分:19)
$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
答案 1 :(得分:10)
嗨,这应该适用于你想要的东西。
$ComponentTobeBuild=@{"ComponentNameX"="Test";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
答案 2 :(得分:8)
我知道这是旧的,但我在寻找其他问题时看到了这一点,并想知道为什么你会厌倦调查员。只需用真实语言完全构建代码:
给我所有键,值为'True'。
$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True' }
为了保持一致性,我会将其封装在@()
中以获取数组,即使只有一个或没有结果。
至于提问者的解决方案,问题是$_
是一个字符串而.Value
不是密钥的值。它根本不存在于String中。您必须使用$_
作为密钥获取散列表的值才能进行比较。
答案 3 :(得分:6)
在PowerShell中过滤Hashtables的问题在于,您无法迭代键值对。
我们假设您有一些收藏品:
$collection = @{
a = 'A';
b = 'B';
c = 'C';
d = 'D';
e = 'E';
...
}
您希望能够使用
$results = $collection | Where-Object { $_.Key -in ('a', 'b', 'd') }
在PowerShell中,但这是不可能的。
因此,您已回归使用枚举器:
$results = $collection.GetEnumerator() | Where-Object { $_.Key -in ('a', 'b', 'd') }
$results
Name Value
---- -----
d D
b B
a A
答案 4 :(得分:1)
您还可以使用Dictionary.Keys
'Where
方法返回条件成立的所有元素。这个条件可能是一个lambda断言被测试的密钥$_
与字典中的"True"
值有关。
$ComponentTobeBuild=@{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"})
# -> @("ComponentNameX")
答案 5 :(得分:0)
我发现最简单(也是最简洁)的方法如下:
$ComponentToBuild.where{$_.Keys -match 'True'}
然后只得到您需要的位
$ComponentToBuild.where{$_.Keys -match 'True'} | select Field1,Field2,Field99
等