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

它是批处理文件的解析类型。
块中的所有百分比,括号内的任何内容,在解析时而不是在执行时扩展。
因此,在您的块中运行任何命令之前,您的 %errrorlevel% 将被扩展一次。所以它通常总是为零。

为了避免这种情况,存在延迟扩展,请改用它。

!errorlevel!而不是%errorlevvel% 并且您需要先激活它才能使用它(最好在批处理脚本的第二行中)。

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 回答