22

我有一个哈希表,其中根据值使用键。

例如。

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

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

我正在尝试这样,但我认为有些地方我错过了,因为它没有列出密钥。

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

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

4

6 回答 6

22
$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
于 2012-07-06T08:25:29.120 回答
16

嗨,这应该适用于您想要的。

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

Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
于 2012-07-06T07:49:41.717 回答
9

我知道这已经过时了,但我在寻找其他问题时看到了这一点,并想知道您为什么要打扰 Enumerators。只需按照真实语言中的问题构建代码即可:

给我所有的钥匙,其中的价值是“真”。

$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True'  }

为了保持一致性,@()即使只有一个结果或没有结果,我也会将其封装成一个数组。

至于提问者的解决方案,问题在于它$_是一个字符串,.Value而不是键的值。它根本不存在于字符串中。您必须使用$_as Key 获取哈希表的值才能进行比较。

于 2013-11-29T08:19:28.517 回答
7

在 PowerShell 中过滤 Hashtable 的问题是您无法遍历键值对。

假设您有一些收藏:

$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
于 2017-02-24T15:35:20.963 回答
3

您还可以使用Dictionary.Keys'Where方法返回条件成立的所有元素。该条件可能是一个 lambda,断言测试的键$_"True"字典中的值相关。

$ComponentTobeBuild=@{"ComponentNameX"="True";
                      "ComponentNameXyz"="False";
                      "SomeComponent"="False"}
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"})
# -> @("ComponentNameX")
于 2018-02-01T12:13:31.390 回答
0

我发现这样做的最简单(也是最整洁)的方法如下:

$ComponentToBuild.where{$_.Keys -match 'True'}

然后得到你需要的位

$ComponentToBuild.where{$_.Keys -match 'True'} | select Field1,Field2,Field99

ETC

于 2019-10-14T10:52:14.023 回答