PowerShell: switch文の書き方

PowerShellでは条件分岐の方法として、 if文以外にもswich文があります。 分岐する条件が多数ある場合はswitch文を 使った方がわかりやすいケースがあります。 switch文の書式は次の通りです。

書式
switch (評価式) {
	値1 { 処理1; break }
	値2 { 処理2; break }
	値3 { 処理3; break }
	...
	Default {処理}
}

評価式には変数やプロパティなど、 評価できる式を記述します。
評価式が値1の時は処理1を実行し、 値2の時は処理2を実行。 いずれの値にも一致しない場合はDefault部分の処理が実行されます。

処理が終わった後にswitch文を抜け出したい場合、 最後にbreak文を記述します。 breakが無いとswitch文を抜けずに次の値の評価に移ります。 ただし意図的にbreakを書かずに次の値を評価することも可能です。

次のサンプルコードは、 数値の入った変数$seasonの値が 0, 1, 2, 3のいずれかによって処理を分岐しています。

PowerShell
$season = 3

switch ($season) {
	0 { Write-Host "春"; break }
	1 { Write-Host "夏"; break }
	2 { Write-Host "秋"; break }
	3 { Write-Host "冬"; break }
	Default {Write-Host "その他"}
}

# 実行結果
冬

次は文字列を評価する場合です。
文字列の入った変数$strの値がa, b, c, dのいずれかによって 処理を分岐しています。 文字列の場合、値を""ダブルクォートや''シングルクォートで囲む 必要がありません。

$str = "d"

switch ($str) {
	a { Write-Host "a"; break }
	b { Write-Host "b"; break }
	c { Write-Host "c"; break }
	d { Write-Host "d"; break }
	Default {Write-Host "other"}
}

# 実行結果
d

Nullや空文字を値の部分に記述する場合、 Nullは「$null」、空文字は「"" または ''」と記述します。 下のコードでは空文字に""ダブルクォートを使っています

$s = $null

switch ($s) {
	a     { Write-Host "a"; break }
	$null { Write-Host "Null"; break }
	""    { Write-Host "Empty"; break }
	Default {Write-Host "other"}
}

# 実行結果
Null

break文あり・なしの動作

break文のあり・なしでどうようにswitch文の動作が違うのかを 具体的に見ていきます。

次のコードは変数$nの値によって処理が分岐しますが、 値の部分はわざと同じ値の「0」にしています。 処理Aの後にはbreak文がなく、 処理Bと処理Cの後にはbreak文があります。 このコードを実行するとどうなるでしょうか?

$n = 0

switch ($n) {
	0 { Write-Host "処理A" }
	0 { Write-Host "処理B"; break }
	0 { Write-Host "処理C"; break }

	Default {Write-Host "その他"}
}

# 実行結果
処理A
処理B

1番目の値「0」はTrueなので処理Aを実行します。 処理Aを実行した後、break文がないので次の評価に移ります。 2番目の値「0」評価した結果、今度もTrueなので処理Bを実行します。 処理Bの後にbreak文があるためここでswitch文を抜け出します。 そのため処理Cは実行されません。
結果的に処理A, Bまでが実行されます。

このようなbreak文の動きを利用して、 わざとswitch文のステートメントブロックを複数実行させることも できます。

PowerShell