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