Windowsバッチファイル

バッチファイルのエラーハンドリング【errorlevel・exit /b・エラー時の処理分岐】

Windowsバッチファイル
記事内に広告が含まれています。

バッチファイルでエラーが起きたとき、適切に対処できるかどうかがスクリプトの品質を大きく左右します。errorlevelexit /b・エラー時の分岐処理について、動作の仕組みから丁寧に解説します。

errorlevelとは何か?

errorlevel は、直前に実行したコマンドが返す「終了コード」です。コマンドが正常に終了した場合は 0、エラーが発生した場合は 1以上の値を返すのが一般的です(コマンドによって異なります)。

@echo off

rem コマンドを実行
copy C:\work\data.txt D:\backup\

rem errorlevelを確認
echo 終了コード: %errorlevel%

rem 0 = 成功、1以上 = エラー
if %errorlevel% equ 0 (
    echo コピー成功
) else (
    echo コピー失敗 終了コード: %errorlevel%
)

重要な注意:if errorlevel 1 は「errorlevelが1以上」という意味です。「1のとき」ではありません。より明確に書くには if %errorlevel% equ 1 を使いましょう。

エラー時に処理を分岐する実践パターン

@echo off
setlocal

set SOURCE=C:\work
set DEST=D:\backup
set LOGFILE=C:\logs\backup_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.log

echo バックアップ開始: %DATE% %TIME% > "%LOGFILE%"

rem ソースフォルダの存在確認
if not exist "%SOURCE%" (
    echo エラー: ソースフォルダが見つかりません: %SOURCE%
    echo エラー: ソースフォルダが見つかりません >> "%LOGFILE%"
    exit /b 1
)

rem バックアップ実行
robocopy "%SOURCE%" "%DEST%" /E /LOG+:"%LOGFILE%"

rem robocopyは7以下が正常(独自仕様)
if %errorlevel% leq 7 (
    echo バックアップ完了 >> "%LOGFILE%"
    echo バックアップが完了しました
) else (
    echo バックアップ失敗 エラーコード: %errorlevel% >> "%LOGFILE%"
    echo エラーが発生しました。ログを確認してください: %LOGFILE%
    exit /b %errorlevel%
)

exit /b 0

exit /b の使い方

コマンド意味使いどころ
exit /b 0正常終了(終了コード0を返す)処理が成功したとき
exit /b 1エラー終了(終了コード1を返す)エラーが発生したとき
exit /b %errorlevel%直前のエラーコードをそのまま返すエラーコードを上位に伝えたいとき
exit(/bなし)コマンドプロンプトごと終了バッチ全体を強制終了するとき

& と || を使った簡易エラー処理

&&(前のコマンドが成功したときのみ次を実行)と ||(前のコマンドが失敗したときのみ次を実行)を使って1行でエラー処理を書けます。

@echo off

rem コピー成功時のみechoを実行
copy C:\work\data.txt D:\backup\ && echo コピー成功

rem コピー失敗時にエラーメッセージを表示
copy C:\work\data.txt D:\backup\ || echo エラー: コピーに失敗しました

rem 組み合わせて使う
copy C:\work\data.txt D:\backup\ && echo 成功 || echo 失敗

まとめ

  • errorlevelは直前のコマンドの終了コード。0=成功、1以上=エラーが多いが例外もある
  • if errorlevel 1 は「1以上のとき」という意味。if %errorlevel% equ 1 の方が明確
  • exit /b 0 で正常終了、exit /b 1 でエラー終了を呼び出し元に通知できる
  • && と || で1行のエラー処理が書ける

robocopyのerrorlevel 7以下が正常という仕様を知らなかった頃、「バックアップが毎回エラーになる」と焦ったことがあります。コマンドによって終了コードの意味が違うため、初めて使うコマンドは必ずMicrosoftのドキュメントで確認するようにしています。

hobbyshift管理人

コメント

タイトルとURLをコピーしました