Windowsバッチファイルでエラーレベルを設定する



Set Errorlevel Windows Batch File



解決:

ERRORLEVELと%ERRORLEVEL%は2つの異なる変数です。それはあなたのコードがエコーリターンコードは%errorlevel%であり、%errorlevel%NEQ 0 >> output.txt %% i、%% j、%% kがおそらく間違っている場合。

ERRORLEVELは組み込みであり、最後のコマンドの結果をフェッチするために使用されます。あなたはそれを次のように使うことができます:



ERRORLEVEL 1ECHOエラーレベルが1以上の場合

エラーレベル できません bashがあなたを許さないように、設定するセット?=..。

%ERRORLEVEL%は環境変数です。もしも%ERRORLEVEL%が設定され、使用時にスクリプトで使用されます%ERRORLEVEL%。もしも%ERRORLEVEL%が設定されていません もしも コマンド拡張機能が有効になっている場合は、 フォールバックERRORLEVEL。ERRORLEVELはしません いいえ アップデート%ERRORLEVEL%。



Raymond Chenには、優れたブログエントリがあります。ERRORLEVELは%ERRORLEVEL%ではありません。この回答の内容の一部は、恥知らずにそこから削除されました。


@ECHO OFF SETLOCAL DEL output.txt 2> nul REMinput.txtの各行をループしますFOR / F'tokens = 1-3 delims =、 '%% i IN(。 ready  input.txt)DO(ECHO。 ECHO。ECHO。ECHO%% iが存在することを確認し、存在しない場合はエラーフラグを設定します。 ready  %% i( 'errorflag ='を設定)ELSE(errorflag = 2を設定)CALLエコーリターンコードは%% errorflag %% ECHO定義されていない場合は%% iを実行しますエラーフラグ(。 ready  %% iを呼び出しますエラーレベル1(SET errorflag = 3)の場合はエラーが発生しなかった場合は%% iをアーカイブに移動しますELSE(ECHOcopy。 ready % %i。 archive %mydate%_%mytime%_ %% j _ %% k _ %% i))ECHOエラーが発生した場合、DEFINED errorflag >> output.txt ECHOの場合、テキストの行を新しいoutput.txtファイルにコピーします。 %% i、%% j、%% k)GOTO:EOF

これが書き直された手順です。

ノート:output.txtは最初に削除されます。それ以外の場合は、>>は既存のファイルに追加します。2> nulは、削除が失敗した場合(ファイルが存在しないなど)のエラーメッセージを抑制します



ブロックステートメント内(括弧で囲まれた一連のステートメント)、ENTIREブロックが解析され、 それから 実行されました。どれでもブロック内の%var%は、その変数の値に置き換えられます ブロックが解析されたとき -ブロックが実行される前。

したがって、IF(何か)else(何か他)は、の値を使用して実行されます当時の%variables%IFが発生しました。

これを克服する2つの一般的な方法は1)を使用することですsetlocalenabledelayedexpansionとuse!var!代わりにの変更された値にアクセスするための%var%varまたは2)サブルーチンを呼び出して、変更された値を使用してさらに処理を実行します。

したがって、の変更された値を表示するCALLECHO %% var %%どこ。CALL ECHO %% errorlevel %%が表示されますが、残念ながらエラーレベルがリセットされます。

定義された変数が真の場合到着 現在 定義されています。

ERRORLEVELは特別な変数名です。これはシステムによって設定されますが、ユーザーが設定した場合、ユーザーが割り当てた値がシステム値を上書きします。

ERRORLEVELnがTRUEの場合エラーレベルはnです またはnより大きいしたがって、ERRORLEVEL0が常に真である場合。

構文SET'var = value '(値は空の場合があります)は、行末の漂遊スペースが割り当てられた値に含まれないようにするために使用されます。

必要なコマンドは単にテスト目的でエコーされました。コマンドが正しいことを確認したら、変更しますエコーコピー先実際にファイルをコピーするには、COPYを使用します。

私は以下を使用しましたinput.txt:

seterr1.bat、J1、K1 seterr5.bat、J2、K2 seterr0.bat、J3 K3 seterr5.bat、J4、K4 notexist.bat、J5、K5

既存のファイルを使用を含むseterr * .bat

@ECHO OFF EXIT / b 1

(どこ最後の行の1は、エラーレベルが返されました)

結果の出力を受け取りました:

seterr1.batが存在することを確認し、コードが返されない場合はエラーフラグを設定します。存在する場合はseterr1.batを実行します。エラーが発生しなかった場合はseterr1.batをアーカイブに移動します。エラーが発生した場合はテキスト行を新しいoutput.txtファイルにコピーします。seterr5を確認します。 batが存在し、コードが返されない場合はエラーフラグを設定します。存在する場合はseterr5.batを実行します。エラーが発生しなかった場合はseterr5.batをアーカイブに移動します。エラーが発生した場合はテキスト行を新しいoutput.txtファイルにコピーします。seterr0.batが存在することを確認します。コードが返されない場合はエラーフラグを設定します。存在する場合はseterr0.batを実行します。エラーが発生しなかった場合はseterr0.batをアーカイブに移動します。copy。 ready  seterr0.bat。 archive  __J3_K3_seterr0.batテキスト行を新しい出力にコピーします。エラーが発生した場合はtxtファイルseterr5.batが存在することを確認し、コードが返されない場合はエラーフラグを設定します。存在する場合はseterr5.batを実行します。エラーが発生しなかった場合はseterr5.batをアーカイブに移動します。テキスト行を新しいoutput.txtファイルにコピーします。エラーが発生しましたnotexist.batが存在することを確認し、コードが2を返さない場合はエラーフラグを設定します存在する場合はnotexist.batを実行しますエラーが発生した場合は、テキスト行を新しいoutput.txtファイルにコピーします

COPYは単に先ほど申し上げたようにエコーしました。

およびoutput.txt

seterr1.bat、J1、K1 seterr5.bat、J2、K2 seterr5.bat、J4、K4 notexist.bat、J5、K5 

次のサブルーチンのようなものを使用します。

:return ECHO @exit / b%1> ret.cmd CALL ret.cmd GOTO:eof

次に、次のように使用します。

:SETLOCALCALLを試みますsomethingThatFailsS​​ET retcode =!errorlevel! CALLsomethingThatPasses:ここではエラーレベルを気にしないでくださいCALL:return!retcode! ENDLOCAL CALL:eof

したがって、全体は次のようになります。

test.cmd .. ..

@ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION CALL:!errorlevel!の場合に試行します。 NEQ 0(ECHO試行に失敗しました)ELSE(ECHO試行に成功しました!)GOTO:eof:Attempt SETLOCAL CALL someThatFails SET retcode =!errorlevel! CALLsomethingThatPasses:ここではエラーレベルを気にしないCALL:return%retcode%ENDLOCAL CALL:eof:return ECHO @exit / b%1> return.cmd CALL ret.bat GOTO:eof

somethatfails.cmd .. ..

DIR失敗するコマンド> nul 2>&1

somethatpasses.cmd .. ..

DIR> null 2>&1

これの1つの副作用は、ret.cmdと呼ばれるファイルが配置されていることです。私は通常、クリーンアップを実行して削除する:endサブルーチンを使用します。