GOTO(ラベルジャンプ)
バッチファイルを作成していると、「特定の条件を満たしたときに処理をスキップしたい」「エラーが発生したらエラー処理に飛びたい」といった場面に遭遇します。
このような処理の流れの制御を実現するのが GOTO コマンドです。
この記事では、GOTO コマンドの基本からサブルーチンの実現方法まで、具体的なサンプルコードを交えて詳しく解説します。
GOTO コマンドの基本構文
GOTO コマンドは、指定したラベルの位置にジャンプするコマンドです。
GOTO ラベル名
ジャンプ先のラベルは、コロン : で始まる行として定義します。
:ラベル名
基本的な使用例
@echo off
setlocal
echo 処理1を実行します。
GOTO SKIP
echo この行はスキップされます。
:SKIP
echo 処理2を実行します。
endlocal
GOTO SKIP によってラベル :SKIP の位置までジャンプするため、間にある echo は実行されません。
ラベル名は大文字・小文字を区別しません。:SKIP、:skip、:Skip
はすべて同じラベルとして扱われます。
条件分岐と組み合わせる
GOTO コマンドは IF コマンドと組み合わせて使用されることが多く、条件に応じて処理の流れを変更できます。
エラー処理への分岐
@echo off
setlocal
copy "important.txt" "backup\important.txt" >nul 2>&1
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
echo バックアップが完了しました。
GOTO END
:ERROR
echo エラー: バックアップに失敗しました。
:END
endlocal
コピーが失敗した場合は :ERROR ラベルに、成功した場合は :END ラベルにジャンプします。
GOTO :EOF でバッチを終了する
GOTO :EOF は、バッチファイルの末尾にジャンプしてバッチの実行を終了する特殊な記述です。
@echo off
setlocal
IF NOT EXIST "config.ini" (
echo エラー: config.ini が見つかりません。
GOTO :EOF
)
echo 設定ファイルを読み込みました。
rem 以降の処理...
endlocal
:EOF は明示的に定義する必要のない特殊なラベルです。コマンド拡張機能が有効な場合(Windows
のデフォルト設定)に使用できます。
メニュー選択の実装
GOTO コマンドを使用すると、ユーザーの選択に応じて異なる処理を実行するメニューを作成できます。
@echo off
setlocal
:MENU
echo.
echo ========== メニュー ==========
echo 1. ファイル一覧を表示
echo 2. ディスク使用量を表示
echo 3. 終了
echo ===============================
set /p CHOICE=番号を入力してください:
IF "%CHOICE%"=="1" GOTO LIST
IF "%CHOICE%"=="2" GOTO DISK
IF "%CHOICE%"=="3" GOTO END
echo 無効な入力です。
GOTO MENU
:LIST
dir /b
GOTO MENU
:DISK
wmic logicaldisk get size,freespace,caption
GOTO MENU
:END
echo プログラムを終了します。
endlocal
この例では、ユーザーが「3」を入力するまでメニューが繰り返し表示されます。
サブルーチンとして使う(CALL :ラベル)
GOTO はジャンプしたら戻ってきませんが、CALL :ラベル を使うとサブルーチン(関数のようなもの)として呼び出し、処理後に元の位置に戻ることができます。
@echo off
setlocal
echo メイン処理を開始します。
CALL :GREET "太郎"
CALL :GREET "花子"
echo メイン処理を終了します。
GOTO :EOF
:GREET
echo こんにちは、%~1 さん!
EXIT /B
サブルーチンは EXIT /B または GOTO :EOF
で終了させる必要があります。これがないと、後続のサブルーチンや処理がそのまま実行されてしまいます。
GOTO コマンドの注意点
過度な使用は避ける
GOTO を多用するとコードの流れが複雑になり、いわゆる「スパゲッティコード」になりがちです。可能な場合は IF/ELSE 文や CALL :ラベル によるサブルーチンで代替することを検討してください。
ループ内では注意が必要
FOR ループの中で GOTO を使用すると、ループが中断されます。ループ内で条件分岐が必要な場合は、IF 文を使用してください。
まとめ
この記事では、GOTO コマンドの使い方について解説しました。
| 用途 | 書き方 |
|---|---|
| ラベルへジャンプ | GOTO ラベル名 |
| バッチを終了 | GOTO :EOF |
| サブルーチン呼び出し | CALL :ラベル |
| サブルーチンから復帰 | EXIT /B |