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の右側に連想配列を指定しても何の意味もないことがわかります。 この辺りは配列と異なる所です。

PowerShell
PR