重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

ERRORLEVELの使い方について質問させて頂きます。

echo Start
cmd /c test1.bat
if %ERRORLEVEL% neq 0 echo 1>mylog.txt else echo 2> mylog.txt
exit


rem test1.batの内容は、下記のようなもの
rem xxx.exe

環境変数 %ERRORLEVEL%は、DOSプロンプトであれ、
チャイルドプロセス test1.bat であれ、とにかく
エラーを保持するとのことですが、
上記のスクリプトが、どんな時でも、本当に正しく動くのか、心配です。

どうせ、ERRORLEVELをみて、何がしかの処理をするなら、
チャイルドプロセスの中で、 xxx.exeの次で、記述すべきではないかと考えます。

はたまた、別の世界(このDOSプロンプト、及びそのチャイルドプロセス以外)での
エラーは、このERRORLEVELには、影響しないのでしょうか?

さしあたり、自分で実験をしてみて、上記のバッチ、或いは、チャイルドプロセスにて記述
いずれも、動作は、期待通りでした。しかし、だからといって、どんな時でも、
期待通りに動くのかは、不明です。

  ERRORLEVELは、エラーを発生させるルーチンの直下で評価すべきであり
  そのルーチンがチャイルドプロセスであれば、チャイルドプロセスの中で処理すべき。
  (cmd /cで戻って、ERRORLEVELを評価するのは、正しくない)

ただ、これに拘ると、スクリプトが分散されてしまい、見通しが悪くなってしまいます。
宜しく、サジェスチョンをお願い申し上げます。

A 回答 (2件)

単なる環境変数の一つと思った方が良いです。


○○を期待する、というものではないです。あくまでプログラムの仕様です。

MSの決めた一覧なんてないと思います。少なくとも聞いたことはないです。

バッチなどで使用できるコマンドでも0やら5000やらが入り乱れています。

>環境変数 %ERRORLEVEL%は、DOSプロンプトであれ、
>チャイルドプロセス test1.bat であれ、とにかく
>エラーを保持するとのことですが、
つまり、この前提が間違いの元です。
    • good
    • 0
この回答へのお礼

ありがとうございます。
確認して、使えるものは使うと言う考えで、やります。

お礼日時:2012/05/12 09:21

ERRORLEVELそのものは単なる環境変数として評価されます。


誰かが変更しなければ直前の値を保持するだけで一連のスクリプト(プロセス)中で何処で設定されたかは考慮しません。

「別の世界」のエラーレベルはプロセスが異なりますので影響を受けません。(起動時から設定されているのであれば影響を受けますが)

どちらにしろ、終了時にERRORLEVELを設定しないプログラムが存在するようなので厳密にエラーを判定できるわけではないようです。

この回答への補足

コメントありがとうございます。

ERRORLEVELの仕組みを理解しているわけではないのですが、色々実験をやってみて、
 正常に終了した時--------------25
 処理対象ファイルがない時--------26
 シリアルポートが適切でない時----21
こんな感じでした。
そのプログラムの作成者が、意図してERRORLEVELを設定していないにしても
確かに、処理結果によって、値が変わっていました。

再現性はありますので、信じてよいのだろうとは思いますが、
原理を理解しておきたいと思います。
例えば、正常終了時の値は、作成者責任(デファオルは0)
マイクロソフトが決めた一覧があって、その値を+-して、
具体的なERRORLEVELは、決まる(DOS側がコントロールする)

宜しくお願いいたします。

補足日時:2012/05/02 21:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!