【bat】バッチファイルで終了コードを返す方法

バッチファイル

バッチファイルが正常に完了したか、またはエラーが発生したかを呼び出し元のプログラム、バッチファイル、スクリプトに知らせる必要がある場合に「終了コード」を使用します。「終了コード」は関数の戻り値のように機能します。

本記事では、バッチファイルの処理を終える際に「終了コード」を設定して呼び出し元に終了状態を通知する方法について記述します。

呼び出される側

バッチファイルの処理を終了する際、exit /b で終了コードを設定します。バッチファイルの成功が成功した場合は 0 、エラーが発生した場合は非ゼロとするのが一般的です。

sample.bat

@echo off
rem サンプルバッチファイル - 終了コードの返し方

rem 引数が提供されているか確認
if "%1"=="" (
    rem 引数がない場合、エラーコード1を返す
    echo 引数なし。
    exit /b 1
)

rem 引数が "OK" と等しいか確認
if "%1"=="OK" (
    rem 成功した場合、コード0を返す
    echo 処理が成功しました。
    exit /b 0
) else (
    rem それ以外の場合、エラーコード2を返す
    echo 不明な引数です。
    exit /b 2
)

呼び出す側

バッチファイルを呼び出した後、%ERRORLEVEL% 環境変数をチェックすることで終了コードを取得できます。これを使用して処理分岐を行うことができます。

以下のサンプルでは sample.bat を異なる引数の条件で3回呼び出し、終了コードの違いにより処理分岐させています。

@echo off

echo 異常系1:引数が無い場合の動作確認
call sample.bat
if %ERRORLEVEL%==0 (
    echo 処理は正常に完了しました。
) else if %ERRORLEVEL%==1 (
    echo 引数が提供されていません。
) else if %ERRORLEVEL%==2 (
    echo 不明な引数が提供されました。
)
echo.

echo 異常系2:引数が期待しない文字列の場合
call sample.bat arg1

if %ERRORLEVEL%==0 (
    echo 処理は正常に完了しました。
) else if %ERRORLEVEL%==1 (
    echo 引数が提供されていません。
) else if %ERRORLEVEL%==2 (
    echo 不明な引数が提供されました。
)
echo.

echo 正常系:引数が"OK"の場合
call sample.bat OK

if %ERRORLEVEL%==0 (
    echo 処理は正常に完了しました。
) else if %ERRORLEVEL%==1 (
    echo 引数が提供されていません。
) else if %ERRORLEVEL%==2 (
    echo 不明な引数が提供されました。
)
echo.

pause

実行結果

異常系1:引数が無い場合の動作確認
引数なし。
引数が提供されていません。

異常系2:引数が期待しない文字列の場合
不明な引数です。
不明な引数が提供されました。

正常系:引数が"OK"の場合
処理が成功しました。
処理は正常に完了しました。

続行するには何かキーを押してください . . .

終了コードの判定方法

終了コードの判定方法には、エラーレベルが値〇と一致するか?という書き方と、エラーレベルが1以上か?という書き方がありますそれぞれサンプルは以下の通りです。

if %ERRORLEVEL%==1

この書き方は、実行したコマンドの終了コードが <数値> と等しい場合に真(true)と評価されます。つまり、if %ERRORLEVEL%==1 は終了コードが1の場合のみ真となります。

echo 正常系:引数が"OK"の場合
call sample.bat OK

if %ERRORLEVEL%==0 (
    echo 処理は正常に完了しました。
) else if %ERRORLEVEL%==1 (
    echo 引数が提供されていません。
) else if %ERRORLEVEL%==2 (
    echo 不明な引数が提供されました。
)

if ERRORLEVEL 1

この書き方は、実行したコマンドの終了コードが <数値> 以上である場合に真(true)と評価されます。つまり、if ERRORLEVEL 1 は終了コードが1以上の場合に真となります。

echo 正常系:引数が"OK"の場合
call sample.bat OK

if ERRORLEVEL 1 (
    echo エラー発生。
) else if %ERRORLEVEL%==1 (
    echo 処理は正常に完了しました。
)
タイトルとURLをコピーしました