プログラミング言語におけるswitch-case文は、複数の選択肢から一つを選んで分岐する便利な構文です。バッチファイルでは直接switch-case文はサポートされていませんが、書き方を工夫すると、似たような処理を記述できます。
この記事では、バッチファイルにおけるswitch-case文的な処理の書き方を紹介します。
実現したい機能
ユーザになにかを選択してもらい、その選択に応じて処理を行うバッチファイルを実装します。
1: りんご, 2: ばなな, 3: ぶどう
好きな果物の番号を選んでください(1-3): 2
ばななが選ばれました。
続行するには何かキーを押してください . . .
サンプルコード1:ラベルを生成してgotoでジャンプ
gotoで指定するラベルは、バッチファイルの処理中に結合して生成することが可能です。以下は、ラベルを生成してgotoでジャンプする例です。
@echo off
setlocal
:input
echo 1: りんご, 2: ばなな, 3: ぶどう
set /p choice="好きな果物の番号を選んでください(1-3): "
rem 入力値の範囲チェック
if %choice% NEQ 1 if %choice% NEQ 2 if %choice% NEQ 3 goto default
rem 選択されたケースにジャンプ ★
goto case%choice%
:case1
echo りんごが選ばれました。
goto end
:case2
echo ばななが選ばれました。
goto end
:case3
echo ぶどうが選ばれました。
goto end
:default
echo 不正な入力です。:%choice%
goto input
:end
endlocal
pause
注意点としては、case%choice% で存在しないラベルが生成された場合に、バッチファイルが途中終了することです。このため、ラベル生成をする際には、入力値の範囲チェックが重要となります。
サンプルコード2:ifとgotoを使用
ifとgotoを使用することでも、switch-case文のような処理を実現できます。
@echo off
setlocal
:input
echo 1: りんご, 2: ばなな, 3: ぶどう
set /p choice="好きな果物の番号を選んでください(1-3): "
rem 選択をひとつずつ判定して指定ラベルにジャンプ ★
if "%choice%"=="1" goto case1
if "%choice%"=="2" goto case2
if "%choice%"=="3" goto case3
goto default
:case1
echo りんごが選ばれました。
goto end
:case2
echo ばななが選ばれました。
goto end
:case3
echo ぶどうが選ばれました。
goto end
:default
echo 不正な入力です。:%choice%
goto input
:end
endlocal
pause
この方法の方が、分岐の処理としては分かりやすいですが、たとえばcaseが10個になるなど、分岐先が多くなると、その分if文も同様に増加するので、やや見辛くなる欠点があります。
まとめ
この記事では、バッチファイルにおけるswitch-case文的な処理の書き方を2つ紹介しました。どちらにもメリット・デメリットが存在しますので、使用する場合に応じて使い分けていただくと良いと思います。