【问题标题】:How to prevent MSBuild from aborting on signtool errorlevel <> 0如何防止 MSBuild 在 signtool errorlevel <> 0 上中止
【发布时间】:2015-01-29 22:01:16
【问题描述】:

在我们当前的设置构建过程 (WiX 3.9) 中,某些文件会经过数字签名。为避免再次对未更改的文件进行签名,我想检查每个文件的签名,如果已签名则跳过签名。

我尝试使用signtool.exe verify /pa filename.exe 检查文件是否已经签名,如果没有签名,signtool 会返回一个非零的 ERRORLEVEL。我想我可以在调用后检查错误代码并妥善处理:

signtool.exe verify /pa %1
IF ERRORLEVEL 0 goto already_signed
rem Sign file now
[...]
goto finished

:already_signed
echo File %1 is already signed, skipping

:finished

如果找到签名并且 signtool 返回 0,这可以正常工作。但是如果没有找到签名,导致 ERRORLEVEL 非零,MSBuild 会立即注意到这一点并显示错误消息:EXEC : SignTool error : No signature found. 一步之后,构建由于签名批处理文件中的 -1 返回码而失败。然而,就构建过程而言,没有错误需要被视为错误。

我已经尝试在signtool verify 调用后将 ERRORLEVEL 重置为 0,但这不起作用。有什么想法吗?

【问题讨论】:

  • 如何重置ERRORLEVEL?忽略批处理文件中任何错误的一种方法是在末尾添加exit /b 0。它对你有用吗?

标签: batch-file msbuild wix signtool


【解决方案1】:

作为 S.T.以上建议,只需在您的:finished 标签下方添加exit /b 0。如果您想在不退出脚本的情况下重置%ERRORLEVEL%,可以执行cmd /c exit /b 0,然后%ERRORLEVEL% 将重置为零,您的脚本将继续。


我觉得我为这个答案付出了一些努力,我将提供一个不相关的提示。 :)

另一个测试退出代码状态的巧妙技巧是conditional execution

>NUL 2>&1 signtool.exe verify /pa "%~1" && (

    echo File %1 is already signed, skipping

) || (

    rem Sign file now
    [...]
    exit /b 0

)

&gt;NUL 2&gt;&amp;1 的东西只是隐藏了signtool.exe 的所有标准输出和标准错误输出。如果signtool 退出0,则&amp;&amp; 之后的代码块触发。否则,|| 之后的代码块触发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-03
    • 2011-12-30
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 2012-03-03
    相关资源
    最近更新 更多