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

Sam*_*abu 15 powershell powershell-2.0

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

对于前者

    $ComponentTobeBuild=@{"ComponentNameX"="True";
                          "ComponentNameXyz"="False";
                          "SomeComponent"="False"}
Run Code Online (Sandbox Code Playgroud)

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

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

$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ant 19

$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
Run Code Online (Sandbox Code Playgroud)


jus*_*inf 10

嗨这应该适合你想要的.

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

Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
Run Code Online (Sandbox Code Playgroud)


小智 9

我知道这是旧的,但我在寻找其他问题时看到了这一点,并想知道为什么你要打扰调查员.只需用真实语言构建完全相同的代码:

给我所有键,值为'True'.

$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True'  }
Run Code Online (Sandbox Code Playgroud)

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

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


oɔɯ*_*ɯǝɹ 6

在PowerShell中过滤Hashtables的问题是您无法迭代键值对.

假设你有一些收藏:

$collection = @{ 
    a = 'A'; 
    b = 'B'; 
    c = 'C'; 
    d = 'D'; 
    e = 'E';
    ...
}
Run Code Online (Sandbox Code Playgroud)

你希望能够使用

$results = $collection | Where-Object { $_.Key -in ('a', 'b', 'd') }
Run Code Online (Sandbox Code Playgroud)

在PowerShell中,但这是不可能的.

因此,您可以回退使用枚举器:

$results = $collection.GetEnumerator() | Where-Object { $_.Key -in ('a', 'b', 'd') }
$results

Name                           Value
----                           -----
d                              D
b                              B
a                              A
Run Code Online (Sandbox Code Playgroud)