ERRORLEVELの使い方

このQ&Aのポイント
  • ERRORLEVELの使い方について質問させて頂きます。環境変数 %ERRORLEVEL%は、DOSプロンプトであれ、チャイルドプロセス test1.bat であれ、とにかくエラーを保持するとのことですが、上記のスクリプトが、どんな時でも、本当に正しく動くのか、心配です。
  • エラーを発生させるルーチンの直下でERRORLEVELを評価すべきであり、そのルーチンがチャイルドプロセスであれば、チャイルドプロセスの中で処理すべきです。
  • スクリプトが分散されてしまい、見通しが悪くなってしまう可能性があるため、サジェスチョンをお願いします。
回答を見る
  • ベストアンサー

ERRORLEVELの使い方

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を評価するのは、正しくない) ただ、これに拘ると、スクリプトが分散されてしまい、見通しが悪くなってしまいます。 宜しく、サジェスチョンをお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
  • EF_510
  • ベストアンサー率50% (306/604)
回答No.2

単なる環境変数の一つと思った方が良いです。 ○○を期待する、というものではないです。あくまでプログラムの仕様です。 MSの決めた一覧なんてないと思います。少なくとも聞いたことはないです。 バッチなどで使用できるコマンドでも0やら5000やらが入り乱れています。 >環境変数 %ERRORLEVEL%は、DOSプロンプトであれ、 >チャイルドプロセス test1.bat であれ、とにかく >エラーを保持するとのことですが、 つまり、この前提が間違いの元です。

atom_28
質問者

お礼

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

その他の回答 (1)

  • EF_510
  • ベストアンサー率50% (306/604)
回答No.1

ERRORLEVELそのものは単なる環境変数として評価されます。 誰かが変更しなければ直前の値を保持するだけで一連のスクリプト(プロセス)中で何処で設定されたかは考慮しません。 「別の世界」のエラーレベルはプロセスが異なりますので影響を受けません。(起動時から設定されているのであれば影響を受けますが) どちらにしろ、終了時にERRORLEVELを設定しないプログラムが存在するようなので厳密にエラーを判定できるわけではないようです。

atom_28
質問者

補足

コメントありがとうございます。 ERRORLEVELの仕組みを理解しているわけではないのですが、色々実験をやってみて、  正常に終了した時--------------25  処理対象ファイルがない時--------26  シリアルポートが適切でない時----21 こんな感じでした。 そのプログラムの作成者が、意図してERRORLEVELを設定していないにしても 確かに、処理結果によって、値が変わっていました。 再現性はありますので、信じてよいのだろうとは思いますが、 原理を理解しておきたいと思います。 例えば、正常終了時の値は、作成者責任(デファオルは0) マイクロソフトが決めた一覧があって、その値を+-して、 具体的なERRORLEVELは、決まる(DOS側がコントロールする) 宜しくお願いいたします。

関連するQ&A

  • bat サブルーチンのERRORLEVELについて

    バッチのサブルーチンのERRORLEVELについて質問です。 サブルーチン内でERRORLEVELを返すコマンドを実行したいのですが、 親ルーチンにそのERRORLEVELを共有したくない場合、何か方法はありますか? ============================================================ [1.bat] SET MSG1="NOTFOUND" SET MSG2="found!" echo %ERRORLEVEL% FIND %MSG1% 2.bat REM %ERRORLEVEL%は1に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% FIND %MSG2% 2.bat REM %ERRORLEVEL%は0に echo %ERRORLEVEL% CALL :LOG echo %ERRORLEVEL% REM %ERRORLEVEL%は0であって欲しいが0に pause EXIT 1 :LOG FIND %MSG1% hogehoge.log REM %ERRORLEVEL%は1に ============================================================ [2.bat] found! ============================================================ [hogehoge.log] 空 ============================================================

  • 終了コード errorlevel の考え方について

    こんばんは。 OSはWindowsXP Proを使っています。 テキストファイルに書いてある値を 終了コードにするバッチファイルを作成しました。 以下の2ファイルを同じディレクトリに保存します。 test.txt ┌--------┐   1 └--------┘ test.bat ┌---------------------------------------┐   @echo off   find "0" test.txt   if not errorlevel 1 exit /b 0   find "1" test.txt   if not errorlevel 1 exit /b 1   echo テキストは0~1の値ではありません。   exit /b 2 └---------------------------------------┘ この状態で次のように実行します (1) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT 1 (2) C:\>echo %errorlevel% 1 (3) C:\>set errorlevel=0 (4) C:\>echo %errorlevel% 0 ※ここでtest.txtの中の数字を2にします。 (5) C:\>test.bat ---------- TEST.TXT ---------- TEST.TXT テキストは0~1の値ではありません。 (6) C:\>echo %errorlevel% 0 (7) C:\>set errorlevel= (8) C:\>echo %errorlevel% 2 となります。 (2)の結果から、(1)で実行した「exit /b 1」でerrorlevelに1が格納されることが判ります。 しかし、(6)の結果から、(3)で実行した「set errorlevel=0」が (5)で実行した「exit /b 2」より優先されていることが判ります。 しかし(7)でerrorlevelの値を消去したように思われますが、 (8)の結果から、(3)のセットを消去しつつ(5)で実行した「exit /b 2」を記憶しているように見えます。 この挙動について、どのように理解すれば良いのでしょうか。 また「exit /b ○」と「set errorlevel=○」でセットする違いについて教えて頂ければと思います。 お願いします。

  • DOSのIF文でつまづいています

    DOSのプログラムでつまづいています。 test.batの中身 ************************************************ if %1==start goto start else if %1==stop goto stop else goto error :start rem スタート処理 echo start%1 > test.txt :stop rem ストップ処理 echo stop%1 > test.txt :error rem エラー処理 echo error%1 > test.txt exit ************************************************* うまく処理できる方法を教えてください。

  • echo と%ERRORLEVEL%の値について

    今日の日付から7日前の日付をテキストファイルに保存しようとし、下記のようにスクリプトを作成しました ago7.vbs --------------------------- dim ago7d ago7d = dateadd("d", -7, now()) WScript.Quit(year(ago7d) & right(100 + month(ago7d),2) & right(100 + day(ago7d),2)) --------------------------- main.bat --------------------------- cscript //nologo ago7.vbs echo %ERRORLEVEL%>D:\log.txt --------------------------- ago7.vbsで7日前の日付を取得し、main.batで受け取り、テキストファイルに出力しています。 こちらをコマンドプロンプトから直接「main.bat」を起動してやると正しく動作しますが、 (この場合のlog.txtは 20120903tが書き込まれて出力されています。) タスクスケジューラを使ってmain.batを実行すると、log.txtの新居陽は下記のようになってしまいます。 ECHO は <ON> です。 いろいろ試してみていますがうまくいきません。 どのようにすればlog.txtの内容が日付になるのでしょうか。

  • コマンドプロンプトからのcmd実行について

    現在VBSでオブジェクトを定義しrunを使いcmd経由で他のバッチ・VBS・ソフトの起動をやっています。 ふととあるパスが実行できませんでした。 そこで別途個別にコマンドプロンプトだけで実行してみましたがやはりうまく処理できません。 [echo.bat] echo test pause [コマンドプロンプト] rem その1 cmd /K c:\temp\a\echo.bat rem その2 cmd /K C:\Temp\(a\echo.bat その1の結果 C:>cmd /K C:\Temp\a\echo.bat C:>echo test test C:>pause 続行するには何かキーを押してください . . . その2の結果 C:>cmd /K C:\Temp\(a\echo.bat 'C:\Temp\' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 C:> 上記のように1は正常に処理され2はうまく処理されません。 解決策をひたすら検索したのですが見つからず なんとなくだいたい分かったのが一部『(』や『)』や『&』や『@』や『^』などの記号が混じるとどうやらうまく処理できないようです。 なぜ処理できないのか?と、如何すればこれを回避して実行できるか分かる方がいればよろしくお願いします。 備考: (現状の緊急回避として記号のあるパスは記号のないパスから経由batを生成する方法を思いつきましたが自分で馬鹿だと思います) (経由バッチの中身が"C:\Temp\(a\echo.bat"ならば実行できるから) また、cmd /K "C:\Temp\(a\echo.bat" では実行できませんでした。 OSはXPです。コマンドプロンプトヴァージョンは(Microsoft Windows XP [Version 5.1.2600])です

  • FOR文内でサブルーチンをCALLした際の、ERRORLEVELの取得

    ファイルをコピーしてからFOR文により6回処理を繰り返すような バッチファイルを作成しようと思っています。 そのFOR文内でコールしたサブルーチンのERRORLEVELがうまく取得できません。ファイルコピーをしなければ値が取得できるのですが。。。 何が 原因なのか皆目見当つかずで行き詰ってしまいました。 どなたか 教えてください。 宜しく御願いします。 @echo off copy test.txt test.txt.bak for /L %%A in (0,1,5) do ( call :test echo 戻り値:%ERRORLEVEL% ) :test exit /b 99

  • バッチファイル(.bat)へWSH(.wsf)のエラーコードの返し方について

    はじめまして、kiwi88と申します。 バッチファイル(.bat)からwshスクリプト(.wsf)を呼び出すプログラムを作成しました。 そこで、wshスクリプトで実行されたエラーコードを呼び出しもとのバッチファイル(.bat)に返すことはできますでしょうか。 以下はバッチファイル(.bat)からwshスクリプト(.wsf)を呼び出す箇所のソースです。 ◆バッチファイル(test.bat)◆ ---------------------------------------- ~※処理内容省略~ cscript test.wsf //nologo //Job:wshscript > batch.log IF %ERRORLEVEL% NEQ 0 GOTO ERR exit :ERR set ret=%ERRORLEVEL% echo ****** [%:ERRORLEVEL=%ret%] ****** > err.txt exit %ret% ---------------------------------------- 以下はwshスクリプト(.wsf)のエラーコードを返す箇所のソースです。 ◆wshスクリプト(test.wsf)◆ ---------------------------------------- <job id = "wshscript"> <script language = "VBScript"> <![CDATA[ Option Explicit Function Main() ~※処理内容省略~ err = Err.Number Main = err End Function ]]> </script> </job> ---------------------------------------- 長くなってしまい、申し訳ありませんが、 ご教授願えますでしょうか。 宜しくお願いいたします。

  • バッチファイルとVBスクリプトの連携エラーコード取得

    イベントログにアベンドしたJOBが出力されない場合 せめて、logファイルにだけでも内容を書きたいのですが うまくいきません。 リターンコードが全部(1)の元バッチファイルで0がかえってきます。 どなたがご教授願います。 (1)親バッチファイルの中味 @echo off rem============================================== rem rem ARG1 = スケジュール日 rem ARG2 = ネットワーク名 rem ARG3 = 終了コード rem rem ================================================ set SDATE=%1 set NETWORK=%2 set RC=%3 set SDATE_SHORT=%SDATE:~2,6% set WK_DIR=D:\temp set TOML_TXT=%WK_DIR%\toml_%NETWORK%.txt set VBSCRIPT=D:\stage\tools\bat\GetJobName.vbs echo ### ARG1(%1) ARG2(%2) ARG3(%3) ### if "%RC%"=="00" ( echo NETWORK NORMAL END #AUTONEND# ) else ( echo NETWORK ABNORMAL END #AUTONEND# if exist %TOML_TXT% ( del %TOML_TXT% ) toml -p999 > %TOML_TXT% cscript //Nologo %VBSCRIPT% %SDATE_SHORT% %NETWORK% %RC% %TOML_TXT% )      if not "%errlrlevel%"=="0" ( set EVT_CRT_RC=%errorlevel% echo EVETCREATE Failed. RC=%EVT_CRT_RC% ) ) exit (2)VBスクリプトの中味 800文字以上になるので、補足要求してください。 (3)イベントログ出力バッチファイルの中味 @echo off rem rem 引数 rem %1:SDATE rem %2:NETWORK rem %3:RC rem %4:JOB set MSG=A-AUTO JOBNET : NETWORK(%2) JOB(%4) SDATE=%1 ABNORMALLY ENDED RC=%3 eventcreate /l application /t error /so autonend /id 999 /d "%MSG%" exit %errorlevel%

  • コマンドプロンプトのcallと遅延展開

    こんにちは。 コマンドプロンプトにおいて、call と !・・・! による環境変数の遅延展開について、 1つ疑問に思う事がありましたので、質問させて頂きました。 まず、以下のようなバッチスクリプトtest.batを作成しました。 -------------------------------------------------------- @echo off setlocal setlocal enabledelayedexpansion set aaa=XXX^|cat echo 1:!aaa! call echo 2:!aaa! echo 3:%aaa% call echo 4:%aaa% --------------------------------------------------------- これを実行した結果、以下のようになりました。 --------------------------------------------------------- C:\Users\kei >test.bat 1:XXX|cat 3:XXX 4:XXX --------------------------------------------------------- callは、それ以降のコマンドラインを2度解析するだけなのに、 なぜ、call echo 2:!aaa! の行を実行した時に、何も出力されないのでしょうか?

  • BATのIF文について質問

    @echo off cls set LOGFILE=C:\%COMPUTERNAME%.log find C:\temp\setting.txt "SERVER01" /I if %ERRORLEVEL% == 1 GOTO END if %ERRORLEVEL% == 0 ( set MESSAGE=SEVER01の環境です echo %MESSAGE% echo %MESSAGE% >> %LOGFILE% GOTO SET1 ) :SET1 echo テスト >> %LOGFILE% :END こんな簡単なBATを作成してみましたがERRORLEVELが0の時処理されません (「SEVER01の環境です」がLOGに書き込まれません) (もちろんsetting.txtには「SERVER01」の文字が入ってます) (FINDのあと、「echo %errorlevel」を記述して0にもなっているのですが) IFの構文として間違っていますか?どなたかご教授ください。 OSはWindowsXP SP3 64Bitです。