如何获取具有特定值的哈希表键?

时间:2012-07-06 07:24:48

标签: powershell powershell-v2.0

我有一个哈希表,根据值使用Keys。

对于前。

    $ComponentTobeBuild=@{"ComponentNameX"="True";
                          "ComponentNameXyz"="False";
                          "SomeComponent"="False"}

我想获得值为True的键。 (我将把密钥传递给其他一些脚本作为参数)。

我是这样尝试的,但我认为我错过了一些因为它没有列出键。

$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }

如何获取表示为True的组件名称?此外,我想知道哈希表是否是这种工作的明智选择。因为我认为哈希表主要用于处理值。

6 个答案:

答案 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