2011年1月3日月曜日

変数 ERRORLEVEL = コマンドの戻り値 - Windowsのコマンドプロンプト(bat,cmd)

Windowsコマンド。制御文と環境変数
○Windows XP
変数 ERRORLEVEL には、直前に実行したコマンドやプログラムの戻り値が入っています。
但し、コマンドによっては、成功時に値を更新しないものがあります。(例えば、ECHO コマンド)

o 擬似的な環境変数です。環境変数 ERRORLEVEL に値が入っていると、その値を表示します。


**** 書式
--------
%errorlevel%
もしくは
if [not] %errorlevel% 演算子 比較する数字 実行するコマンド
もしくは
if [not] errorlevel 比較する数字 実行するコマンド
--------

o コマンド名やキーワードは、大文字小文字のどちらでも大丈夫です。
o 演算子 = 「==」や「EQU」などがあります。詳しくは、「IF = 条件に一致したら実行する
o 比較する数字 = 整数の値をそのまま書きます。(「393」や「-393」)
o 実行するコマンド = 詳しい書き方は、「IF = 条件に一致したら実行する

(変数として使う時)
--------
%errorlevel%
--------

o 通常は整数値が入っています。
    + 負の値になる可能性もあります。(= プログラムから負の値を返す事が出来ました。)
    + 文字列が入るのは、「set errorlevel=ミクさん」のように書いてしまった時です。
    + 「set errorlevel=」とすると、元の状態に戻ります。

(IF 文で使う時。その1)
--------
if [not] %errorlevel% 演算子 比較する数字 実行するコマンド
--------

o 演算子に「==」を使う時は、「"」で括る書き方も出来ます。
    + 信頼性は、どちらも同じです。
    + 理由は、変数 ERRORLEVELには、必ず値が入るからです。
o 変数 ERRORLEVEL の大小判定が必要な時は、通常「"」を付けません。
    + 「"」で括ると文字列として比較します。「"13"」よちも「"3"」の方が大きくなります。
o 正常終了を検知をしたい時は、通常 ==0(= 「=」を2つ並べます)を使います。
o(= この点は動作確認が必要です。「全てのプログラムが、正常終了時に必ず 0 を返す」とは限りません。)

(IF 文で使う時。その2)
--------
if [not] errorlevel 比較する数字 実行するコマンド
--------

o この書き方の場合、比較する数字「以上」になっていると真です。
    + 出来るだけ古いパソコンにも対応させたい時は、こちらの書き方が良いみたいです。

** (半)自動化時のエラー判定方法について
o 呼び出すプログラムによって、エラーの判定方法は変わります。それに合わせて適切な書き方を選びます。
o 例えば、プログラムから -1などの負の値を返す事も、技術的には可能です。
o また、「正常終了でも異常終了でも 0 を返す」ERRORLEVELが使えないプログラムも存在します。
    + この場合は、エラーメッセージやログファイルなど、判定出来る材料を探します。
    + そして、ファイルの有無や特定文字列の検索などで、エラー判定を行います。


**** 使用例
--------
echo エラーコードは、%errorlevel%でした。

if %errorlevel%==393 echo ミクさん、おはようございます。
if not errorlevel 393 echo ミクさんはお昼寝中です。
(この書き方の場合、「393以上ではない」 = 「392以下」の意味になります。)
--------



**** 機能
o コマンドの戻り値を返します。
o コマンドをまだ呼び出していない時、ERRORLEVEL の値は 0 になっています。
o コマンドを連続実行して、途中でエラーになった時、最後のコマンドが ERRORLEVEL を設定するかどうかは、コマンドによって異なります。
    + ERRORLEVEL を上書きするとは限りません。
    + 例えば ECHO コマンドは、成功時に値を設定しませんでした。
o コマンド拡張機能を無効にすると、この値は未定義状態になります。
o 擬似的な環境変数です。環境変数 ERRORLEVEL に値が入っていると、環境変数 ERRORLEVEL の値を取得します。

o ERRORLEVEL の値を元に戻したい時は、次のようにします。
--------
set errorlevel=
--------

    + ERRORLEVEL の値を設定しないのが、ポイントです。
    + なお、ERRORLEVEL に値を設定すると、コマンドの戻り値は ERRORLEVEL に反映されなくなります。

o ERRORLEVEL の値を 0 にしたい時は、次の2つの方法があります。
    + 値が 0 になるコマンドを発行する
    + プログラムを呼び出す。お手軽なのは、「cmd /c exit 0」
o 「set errorlevel=0」のように直接代入してしまうと、ERRORLEVEL の値が固定化されますので、使えません。


**** メモ
o 「等しい」と書く時は、「%」を忘れないように気を付けます。
    + 「if %errorlevel%==393」 は「393 と等しい」
    + 「if errorlevel==393」は「393 以上」の意味になります。(= Windows XPの場合)
        + この構文はエラーになりませんので、書く時に気を付けます。


**** 確認したバージョン
o Windows XP Service Pack 3


==
関連ページ:
    ▼Windowsコマンド。制御文と環境変数▼ABC順
    ▼Windowsコマンド一覧▼ABC順
    ▼コマンドプロンプト画面
    ▼制作メモ
    > 変数 CD = カレントディレクトリ = 現在の場所
    変数 DATE = 現在の日付
    変数 TIME = 現在の時刻
(2011年8月7日追加。書式欄にて演算子の誘導リンクと、メモ欄)
(2011年2月19日変更。書式欄にて、エラー判定の説明見直し)
(2011年2月6日変更。タイトルを%付きに。設定例は>NUL不要。コマンド拡張機能無効時の動きを追加)
(2011年1月30日追加。細かい説明)