PowerShell: 連想配列をforeachでループする
PowerShellの連想配列(ハッシュテーブル)で、 foreachを使ったループの方法を解説します。 foreachでループする場合は連想配列のKeysプロパティや Valuesプロパティを使用します。 Keysはキーのコレクション、Valuesは値のコレクションです。 それぞれの方法について説明していきます。
Keysプロパティによるforeachループ
Keysプロパティは連想配列に含まれるキーのコレクションです。 foreach文で「変数 in 連想配列.Keys」と書くことで変数の中にキーが順番に 格納されます。
次のコードはKeysプロパティとforeachを使ったループの例です。 変数$keyにキーが順番に格納され、 キーと値を表示しています。
$h = @{ a = 100 b = 200 } foreach ($key in $h.Keys) { Write-Host $key Write-Host $h[$key] } # 実行結果 a 100 b 200
変数$keyを使って値を取得している部分の「$h[$key]」は 次のように書いても同じです。
$h.$key $h.Item($key)
Valuesプロパティによるforeachループ
Valuesプロパティは連想配列に含まれる値のコレクションです。 foreach文で「変数 in 連想配列.Values」と書くことで変数の中にキーが順番に 格納されます。
次のコードはValuesプロパティを使ったforeachによるループの例です。 この場合は連想配列のキーがわからないので、 値だけがわかればいい時に使えます。
$h = @{ a = 100 b = 200 } foreach ($value in $h.Values) { Write-Host $value } # 実行結果 100 200
「変数 in 連想配列」と書くとどうなる?
foreach文で「変数 in 連想配列」 のようにinの右側に連想配列自体を指定するとどうなるか試してみます。
$h = @{ a = 100 b = 200 c = 300 } foreach ($a in $h){ $a.GetType().Name $a.Count } # 実行結果 Hashtable 3
実行結果からわかるように、 連想配列$hの要素数は3ですがループは1回限りです。 変数$aにはハッシュテーブル$hそのものが入っています。 つまりinの右側に連想配列を指定しても何の意味もないことがわかります。 この辺りは配列と異なる所です。