エラーレベルでの分岐

アプリケーションは、終了時にシステムに対して値を返すことができます。例えば、C言語でプログラムを作ったことがあればmain()関数の最後にreturn文で整数を返したはずです。この値がどのような意味を持っているのかはアプリケーションが定めますが、システムはアプリケーションが返した終了コードを受け取り、ifコマンドでバッチ処理できます。多くの開発者にとってもあまり意識されない終了コードですが、エラーの発生などによって返す値を定めることで、バッチファイルによる管理が可能になります。

if errorlevel 番号 コマンド

このifコマンドは、直前に実行したアプリケーションの終了コードが指定した番号と同じかそれより上であれば、続くコマンドを実行します。多くのアプリケーションは、正常終了した場合は0を返し、そうでなければ0以外の値を返します。この場では、次のようなC言語のプログラムを作成してテストに使いましょう。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int code;
    if (argc < 2)
    {
        printf("Return 0\n");
        return 0;
    }

    code = atoi(argv[1]);
    printf("Return %d\n", code);
    return code;
}

上のC言語で書かれたプログラムは、コマンドラインから受け取ったパラメータをそのまま終了コードとして返します。このプログラムをReturnCodeという名前の実行ファイルとしてコンパイルしてください。バッチファイルから ReturnCodeを実行し、直後にifコマンドで結果を調べてみましょう。

サンプル 03

@prompt $G

ReturnCode 4
@if errorlevel 5 echo 深刻なエラーです

ReturnCode 5
@if errorlevel 5 echo 深刻なエラーです

@pause

実行結果

サンプル03の実行結果

サンプル03は、C言語で作成したプログラムReturnCodeを実行し、得られた終了コードが5以上かどうかをifコマンドで調べています。条件が整えば続くechoコマンドが実行されます。ReturnCodeに渡すパラメータの値がそのまま終了コードとして返されるので、終了コードを変更して if コマンドの動作を確認してください。

終了コードはERRORLEVELという名前の環境変数からも取得できます。上のifコマンドは終了コードが指定した値以上かどうかでしか判定できませんが、ERRORLEVEL環境変数と値を比較すれば、終了コードが特定の値だった時に対象のコマンドを実行することができます。

サンプル 04

@echo off

ReturnCode 1
if %ERRORLEVEL% == 0 echo 正常終了しました
if %ERRORLEVEL% == 1 echo エラー:必要なコンポーネントがありません
if %ERRORLEVEL% == 2 echo エラー:必要なファイルがありません
if errorlevel 3 echo エラー:予期しない問題で終了しました

pause

実行結果

サンプル04の実行結果

サンプル04は、エラーの内容によって終了コードが変化するアプリケーションのバッチ処理を想定したものです。アプリケーションが0を返せば正常終了したものとし、それでなければエラー内容によって割り当てられた終了コードを返すものとします。