前回の記事では if 文を取り上げました。
今回は、if 文と同様に、条件によって分岐処理を行うことができる switch 文について説明します。
switch 文の基礎
switch 文は、式が返す値ごとに処理を分岐させるためのもので、書式は以下の通りです。
switch (式) { 値1 {式の結果が値1と一致した場合に実行する処理} 値2 {式の結果が値2と一致した場合に実行する処理} : 値N {式の結果が値Nと一致した場合に実行する処理} default {上記のどの値とも一致しなかった場合の処理} }
default キーワードは、「どの値とも一致しなかった場合」を意味します。この default は、省略することが可能です。
switch 文の例1
以下は変数の値(整数値)によって処理を分岐させる例です。
$a = 2 switch ($a) { 1 {Write-Host "1"} 2 {Write-Host "2"} default {Write-Host "どの値とも一致しません"} }
switch 文の例2
以下は変数の値(整数値)によって処理を分岐させる例です。
$a = "banana" switch ($a) { "apple" {Write-Host "リンゴが選択されました"} "banana" {Write-Host "バナナが選択されました"} "orange" {Write-Host "オレンジが選択されました"} default {Write-Host "どの値とも一致しません"} }
break キーワードと continue キーワードによる中断処理
PowerShell Core の switch 文 では、break キーワードを使用して処理を中断することができます。
ここでは、それぞれについて説明をします。
break キーワード
break キーワードを使用すると、それ以降の値との比較は行われなくなります。
例えば以下の例では、値「3」の箇所が2つありますが、1つめの「3」のところに break キーワードがあるので、それ以降の値との比較は行われません。
よって「C」のみが出力されます。
$a = 3 switch ($a) { 1 {Write-Host "A"} 2 {Write-Host "B"} 3 {Write-Host "C"; break} 3 {Write-Host "D"} 4 {Write-Host "E"} 5 {Write-Host "F"} default {Write-Host "None"} }
continue キーワード
例えば以下の例では、値「3」の箇所が2つありますが、1つめの「3」のところに continue キーワードがあるので、それ以降の値との比較は行われません。
よって「C」のみが出力されます。
$a = 3 switch ($a) { 1 {Write-Host "A"} 2 {Write-Host "B"} 3 {Write-Host "C"; continue} 3 {Write-Host "D"} 4 {Write-Host "E"} 5 {Write-Host "F"} default {Write-Host "None"} }
break キーワードと continue キーワードの違い
switch 文においては、break キーワードと continue キーワードの動作は同じです。
動作が異なるのは「繰り返し処理」の時となります。別記事にて紹介する予定です。
日本語でbreak は「中断」、continueは「継続」を表しますので、「break」を使用することをお勧めします。
switch 文で使用できるパラメータ
switch 文で使用できるパラメータはさまざまなものがあります。
ここでは、それぞれのパラメータの使用方法について説明します。
-Exact
-Exact (-e でも可)は主に文字列の完全一致を比較する場合に使用します。
ここでいう「完全一致」は、大文字・小文字を無視して判断をしますので「abc」と「ABC」は同一としてみなします。
以下は、いずれの値とも一致します。
$a = "ABC" switch -Exact ($a) { "abc" {Write-Host "一致"} "Abc" {Write-Host "一致"} "ABC" {Write-Host "一致"} }
-CaseSensitive
-CaseSensitive (-c でも可)は文字列の大文字と小文字を区別して比較をする場合に使用します。
よって「abc」と「ABC」は異なる文字として判断をします。
$a = "ABC" switch -CaseSensitive ($a) { ”abc" {Write-Host "不一致"} "Abc" {Write-Host "不一致"} "ABC" {Write-Host "一致"} }
-Wildcard
-Wildcard(-wも可)はワイルドカードによる比較をする場合に使用します。
以下の例では「”任意の一文字”」と「0文字以上の任意の文字列」が出力されます。
$a = "orange" switch -Wildcard ($a) { "o?an?e" {Write-Host "任意の一文字"} "or*" {Write-Host "0文字以上の任意の文字列"} default {Write-Host "不一致"} }
-Regex
-Regex (-r でも可)は正規表現を使用して比較します。
正規表現については別記事で取り上げることとします。
以下を実行すると「オレンジ」が出力されます。
$a = "orange" switch -Regex -CaseSensitive ($a) { "^[a-z]{2}pple" {Write-Host "リンゴ"} "^[a-z]{2}ang*" {Write-Host "オレンジ"} default {Write-Host "不一致"} }
-file
-file (-f でも可)は、ファイルの中身を使用して比較します。
以下は、./Sample.txt というファイルに「オレンジ」と書かれていることを前提として実行をする例です。結果、「orange」が出力されます。
Get-Content ./Sample.txt オレンジ switch -File ./Sample.txt { "リンゴ" {Write-Host "apple"} "オレンジ" {Write-Host "orange"} "バナナ" {"Write-Host banana"} default {Write-Host "不一致"} }
まとめ
C# や Java、C言語などの switch 文と比較すると、さまざまなオプションがあることがわかります。
オプションは多用せずに、他言語のようにシンプルに使用しても構いません。
これを機会にしっかりと身に付けましょう。
コメント