C#プロジェクトのいくつかのコマンドを実行するビルド後イベントがあります。最後のコマンドにより、ERRORLEVEL値がゼロにならないことがあり、ビルドが失敗します。
ERRORLEVEL値を常にゼロに設定するために、コマンドの追加行を追加したい。それを行う最も便利な方法は何ですか?
「exit 0」はこの問題に対処する良い方法のように見えることがわかりました。
使用例:
NET STOP UnderDevService/Y
出口0
underDevServiceサービスが開始されていない場合。
exit /b 0
を使用すると、親も終了せずに、子バッチスクリプト内からerrorlevel 0
を返すことができます。
トリックをするようです:
ver > nul
すべてが機能するとは限らず、その理由は明らかではありません。たとえば、次のことは行いません。
echo. > nul
cls > nul
ビルド前またはビルド後イベントで、実行可能ファイルのリターンコードがゼロより大きく、実行可能ファイルへの呼び出しがビルド前またはビルド後イベントの最後の行でない場合、簡単な方法でミュートして回避するゼロ以外のerrorlevel
のチェックをトリガーするには、失敗した行の後に明示的にゼロを返す行を続けます。
cmd /c "exit /b 0"
これは本質的に、ビルド前またはビルド後イベントの最終行であるjust以上で機能する前述のソリューションの一般的な組み合わせです。
私は個人的にこれを使用します:
cd .
UNIX Shellでも動作します。
しかし、これは少し速いかもしれません:
type nul>nul
Process Monitor
はcd .
のQueryDirectory
呼び出しを示すため
PS:cd .
には、Unixシェルに別の素晴らしい副作用があります。消去前に開かれている場合、ターミナルで再作成された作業ディレクトリを復元します。
VERIFY
またはVERIFY > nul
を使用します
これが「ビルド後イベント」などのようなスニペットである場合、次のように追加できます。
(...) || ver > nul
最後のコマンドの最後。
代わりに
cmd /c "exit /b 0"
windowsシェルを知っている読者は、何が起こっているのか、あなたの意図は何であるかを知っているでしょう。
ただし、バッチスクリプトを使用している場合は、akrotの答えの「子バッチスクリプト」に相当する軽量のサブロータインを使用できます。
サブルーチンがあります:
:reset_error
exit /b 0
そして、ちょうど
call :reset_error
必要な場所ならどこでも。
完全な例を次に示します。
@echo off
rem *** main ***
call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%
call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%
call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%
:: this is needed at the end of the main body of the script
goto:eof
rem *** subroutines ***
:empty
goto:eof
:raise_error
exit /b 1
:reset_error
exit /b 0
どの出力:
After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
ご覧のとおり、goto:eofを介して呼び出して戻るだけでは不十分です。
以下に、ErrorLevel
状態をリセットする他の方法を示します。これは、MS-DOSでも機能します(少なくともバージョン6.22の場合)。
more < nul > nul
rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul
次の方法は、MS-DOSでのみ機能します。
command /? > nul
fc nul nul > nul
完全を期すために、これはErrorLevel
状態を1
に設定します。これはWindowsとMS-DOSの両方に有効です:
< nul find ""
失敗する可能性のある各コマンドの後に>nul
を追加します-これにより、ビルドの失敗を防ぐことができます。
%errorlevel%
を調べることで、コマンドの結果を確認できます。
例えば:
findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)