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

これが古いことは知っていますが、他の問題を検索しているときにこれを見て、なぜ列挙子を気にするのか疑問に思いました。実際の言語での質問とまったく同じようにコードを作成するだけです。

値が「True」のすべてのキーを教えてください。

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

@()一貫性を保つために、結果が 1 つまたはまったくない場合でも、それをカプセル化してArray を取得します。

質問者が持っていた解決策に関しては、問題は$_文字列で.Valueあり、キーの値ではないことです。文字列には存在しません。$_比較するには、ハッシュテーブルの値をキーとして取得する必要があります。

于 2013-11-29T08:19:28.517 に答える