1

バッチ ファイルで msbuild コマンドを呼び出しています。

バッチ ファイルの for ループを介してパラメーターを渡しました。

FOR %%C in (
    CommonInfrastructure
    CommonUtilities
    ) do ( 
        msbuild /t:%BuildCmdType% %BuildFile%  /p:Group=%%C %msbuildLogger% /p:Configuration=Release
        if %ERRORLEVEL% NEQ 0 (
        msbuild /t:SendFailureMail /p:ErrorLogFileName=%ErrorLog% %BuildFile%
        set ErrorBuild=1
        )
    )

ログ ファイルを分析すると、If ブロック内のコードが実行されていないことがわかります。

そのため、通知メールは送信されていません。

if条件を実行する方法は?

4

2 に答える 2

4

これは、バッチ ファイルの解析の種類です。
ブロック内のすべてのパーセント (括弧内のもの) は、実行時ではなく解析時に展開されます。
したがって、 %errorlevel% は、ブロックでコマンドが実行される前に、一度だけ展開されます。したがって、通常は常にゼロになります。

これを回避するために遅延拡張が存在するので、代わりにこれを使用します。

!errorlevel!And %errorlevvel% you need to activate it before you can use (バッチ スクリプトの 2 行目に最適)。

setlocal EnableDelayedExpansion
于 2012-10-17T08:08:06.943 に答える
4

jeb は問題を正しく診断し、適切な解決策を提供してくれました。他のオプションがあります。

IF ERRORLEVEL 1 ...(パーセントなし) は、ERRORLEVEL が 1 以上であるかどうかをチェックします。これは、msbuild が負の ERRORLEVEL を返さない限り機能するはずです。

FOR %%C in (
    CommonInfrastructure
    CommonUtilities
) do ( 
    msbuild /t:%BuildCmdType% %BuildFile%  /p:Group=%%C %msbuildLogger% /p:Configuration=Release
    if ERRORLEVEL 1 (
        msbuild /t:SendFailureMail /p:ErrorLogFileName=%ErrorLog% %BuildFile%
        set ErrorBuild=1
    )
)


変数と IF (NOT) DEFINED を使用することにより、展開を使用せずにゼロ以外の値をテストできます。

set "success="
FOR %%C in (
    CommonInfrastructure
    CommonUtilities
) do ( 
    msbuild /t:%BuildCmdType% %BuildFile%  /p:Group=%%C %msbuildLogger% /p:Configuration=Release
    if errorlevel 0 if not errorlevel 1 set success=1
    if not defined success (
        msbuild /t:SendFailureMail /p:ErrorLogFileName=%ErrorLog% %BuildFile%
        set ErrorBuild=1
    )
)


私の推奨する解決策は||、前のコマンドが失敗した場合にのみ、演算子を使用してコマンドを条件付きで実行することです。&&(注 -成功時に条件付きで実行する演算子もあります)

FOR %%C in (
    CommonInfrastructure
    CommonUtilities
) do ( 
    msbuild /t:%BuildCmdType% %BuildFile%  /p:Group=%%C %msbuildLogger% /p:Configuration=Release || (
        msbuild /t:SendFailureMail /p:ErrorLogFileName=%ErrorLog% %BuildFile%
        set ErrorBuild=1
    )
)
于 2012-10-17T11:56:07.980 に答える