PowerShell: switch文で配列や連想配列を処理する

PowerShellのswitch文では、配列や連想配列(ハッシュテーブル) を処理できる便利な機能があります。 評価式の部分に配列や連想配列を指定することで、 コレクションの各要素をループして処理できます。

配列はそのまま指定すればいいのですが、 連想配列の場合はキーか値かを指定する必要があり、 KeysプロパティかValuesプロパティを使います。

もう一つの注意点として、 breakとcontinueの使い方があります。 break文を使うとswitchを抜け出してしまい、次の要素が実行されません。 抜け出さずに次の要素に移りたい場合はcontinueを使います。 配列や連想配列をswitch文で処理する場合は、 ループ文を書くときと同じようにbreakとcontinueを使ってください。

配列

配列はswitch文の評価式の部分にそそまま「$配列名」と記述することで、 配列の各要素を評価します。

次のコードは1から4までが格納された配列$arrをswitch文で指定しています。 ステートメントブロックの最後にbreakではなくcontinueを使って 次の要素に進んでいます。

$arr = 1 .. 4

switch ($arr) {
	1 { Write-Host "1"; continue}
	2 { Write-Host "2"; continue}
	3 { Write-Host "3"; continue}
	Default {Write-Host "other"}
}

# 実行結果
1
2
3
other

もしcontinueではなくbreakと記述した場合は、 最初の要素「1」を評価して「1」と表示した後に switch文を抜け出します。 以降は何も処理されず、実行結果は次のようになります。

# 実行結果
1

連想配列(キー)

連想配列(ハッシュテーブル)のキー部分のコレクションは Keysプロパティで取得できるので、 switch文に「$連想配列名.Keys」と指定します。

次のコードは4つの要素(キーと値のペア)を持つ連想配列$hの Keysプロパティを指定し、キーの値によって処理を分岐しています。

$h = @{
	a = 1
	b = 2
	c = 3
	d = 4
}

switch ($h.Keys) {
	a { Write-Host "a"; continue}
	b { Write-Host "b"; continue}
	c { Write-Host "c"; continue}
	Default {Write-Host "other"}
}

# 実行結果
other
c
a
b

連想配列は順序が不定なので評価される順番はわかりません。

連想配列(値)

連想配列の値のコレクションはValuesプロパティで取得できるので 「$連想配列名.Values」と指定します。

次のコードは先程と同じ4つの要素を持つ連想配列$hの Valuesプロパティを指定しています。

$h = @{a = 1;b = 2;c = 3;d = 4}

switch ($h.Values) {
	1 { Write-Host "1"; continue}
	2 { Write-Host "2"; continue}
	3 { Write-Host "3"; continue}
	Default {Write-Host "other"}
}

# 実行結果
other
3
1
2
PowerShell