ERRORLEVELについてのメモ (1)

バッチファイルのERRORLEVELについてのメモです。2回の記事に分けます。*1 (前回: id:simply-k:20100813:1281675737)

ヘルプ

ERRORLEVELについてのヘルプは、以下のコマンドで参照できます。

  • if /? (最初の方と最後の方の2カ所)
  • exit /?
  • set /? (最後の方)

ERRORLEVELの設定と参照

ERRORLEVELの設定

ERRORLEVELは、以下のような場合に設定されます。

  • 実行したコマンドが終了コードを設定した場合
  • 存在しないコマンドを呼出そうとした場合
  • callしたバッチスクリプトが「exit /b 終了コード」の形式で終了した場合
ERRORLEVELの参照

ERRORLEVELの値は、通常の環境変数と同じように、%ERRORLEVEL%」または!ERRORLEVEL!(遅延展開の場合)で参照します。ただし、ユーザが明示的にERRORLEVELという名前の環境変数を定義した場合、これらの方法での参照はできなくなります。*2

動作確認

テスト用のバッチファイル

@echo off

rem テスト1 (初期状態)
echo [test-1] %ERRORLEVEL%

rem テスト2 (コマンドの正常終了)
copy NUL NUL > NUL
echo [test-2] %ERRORLEVEL%

rem テスト2 (コマンドの異常終了)
copy > NUL
echo [test-3] %ERRORLEVEL%

rem テスト4 (再びコマンドの正常終了)
copy NUL NUL > NUL
echo [test-4] %ERRORLEVEL%

rem テスト5 (存在しないコマンド)
abcde 2> NUL
echo [test-5] %ERRORLEVEL%

rem テスト6 (バッチスクリプト)
call :test_exit_b
echo [test-6] %ERRORLEVEL%

pause
exit /b 0

rem 「exit /b」をテストするためのバッチスクリプト
:test_exit_b
exit /b 567


実行結果

[test-1] 0
[test-2] 0
[test-3] 1
[test-4] 0
[test-5] 9009
[test-6] 567

ERRORLEVELによる処理の分岐

説明

以下のような方法があります。

  • if文を使う
    • 「if ERRORLEVEL n」の形式を使う
    • %ERRORLEVEL%を使って判定する。
  • callでバッチスクリプトを呼び出す
  • goto文を使う
動作確認

テスト用のバッチファイル

@echo off

rem テスト1 (「if ERRORLEVEL n」を使う)
echo [test-1]
call :set_errorlevel 1
if ERRORLEVEL 0 echo 0以上
if ERRORLEVEL 1 echo 1以上
if ERRORLEVEL 2 echo 2以上
if not ERRORLEVEL 0 echo 0未満
if not ERRORLEVEL 1 echo 1未満
if not ERRORLEVEL 2 echo 2未満
echo.

rem テスト2 (%ERRORLEVEL ...%で判定する)
echo [test-2]
call :set_errorlevel 345
if %ERRORLEVEL% equ 345 echo 345
if %ERRORLEVEL% neq 345 echo 345以外
if %ERRORLEVEL% geq 300 echo 300以上
if %ERRORLEVEL% geq 400 echo 400以上
if %ERRORLEVEL% leq 300 echo 300以下
if %ERRORLEVEL% leq 400 echo 400以下
echo.

rem テスト3 (callでバッチスクリプトを呼び出す)
echo [test-3]
call :set_errorlevel 3
call :sub_errorlevel_%ERRORLEVEL%
call :set_errorlevel 1
call :sub_errorlevel_%ERRORLEVEL%
echo.

rem テスト4 (goto文を使う)
echo [test-4]
call :set_errorlevel 2
goto lbl_error_%ERRORLEVEL%

:lbl_error_1
echo lbl_error_1を通りました
goto end

:lbl_error_2
echo lbl_error_2を通りました
goto end

:lbl_error_3
echo lbl_error_3を通りました
goto end

:end

pause
exit /b 0

rem ERRORLEVELを設定するサブルーチン
:set_errorlevel
exit /b %1

rem サブルーチン1
:sub_errorlevel_1
echo %0がcallされました
exit /b 0

rem サブルーチン2
:sub_errorlevel_2
echo %0がcallされました
exit /b 0

rem サブルーチン3
:sub_errorlevel_3
echo %0がcallされました
exit /b 0


実行結果

[test-1]
0以上
1以上
2未満

[test-2]
345
300以上
400以下

[test-3]
:sub_errorlevel_3がcallされました
:sub_errorlevel_1がcallされました

[test-4]
lbl_error_2を通りました


続きは次回です。(前回: id:simply-k:20100813:1281675737)

*1:Windows XP SP3で確認しました。

*2:「set /?」参照