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
)
)