値に基づいてキーが使用されているハッシュテーブルがあります。
例えば.
$ComponentTobeBuild=@{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
値がTrueのキーを取得したいです。 (キーをパラメーターとして他のスクリプトに渡します)。
私はそのようにしていましたが、キーがリストされていないため、私が行方不明になっている場所があると思います。
$($ComponentToBuild.Keys) | Where-Object { $_.Value -eq "True" }
Trueと表示されているコンポーネント名を取得する方法は?また、ハッシュテーブルがこの種の作業にとって賢明な選択であるかどうかを知りたいです。ハッシュテーブルは主に値の処理に使用されると思ったからです。
こんにちは、これはあなたが望むもののために働くはずです。
$ComponentTobeBuild=@{"ComponentNameX"="Test";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
Foreach ($Key in ($ComponentTobeBuild.GetEnumerator() | Where-Object {$_.Value -eq "Test"}))
{$Key.name}
$ComponentTobeBuild.GetEnumerator() | ? { $_.Value -eq "True" }
私はこれが古いことを知っていますが、他の問題の検索でこれを見たので、なぜ列挙子に悩まされるのか疑問に思いました。実際の言語の質問とまったく同じようにコードを作成するだけです。
値が「True」であるすべてのキーを教えてください。
_$ComponentTobeBuild.Keys | ? { $ComponentTobeBuild[$_] -eq 'True' }
_
一貫性を保つために、@()
にカプセル化して、結果が1つしかない場合や配列がない場合でも配列を取得します。
質問者が持っていたソリューションに関しては、問題は_$_
_が文字列であり、_.Value
_がキーの値ではないことです。 Stringには存在しません。比較するには、_$_
_をキーとしてハッシュテーブルの値を取得する必要があります。
PowerShellでハッシュテーブルをフィルタリングする際の問題は、キーと値のペアを反復処理できないことです。
コレクションがあるとしましょう:
$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
また、条件が満たされるすべての要素を返すDictionary.Keys
'Where
メソッドを使用することもできます。その条件は、テストされたキー$_
がディクショナリの"True"
値に関連していることをアサートするラムダである可能性があります。
$ComponentTobeBuild=@{"ComponentNameX"="True";
"ComponentNameXyz"="False";
"SomeComponent"="False"}
$ComponentTobeBuild.Keys.Where({$ComponentTobeBuild[$_] -eq "True"})
# -> @("ComponentNameX")