如何防止MSBuild在signtool错误级别上中止<> 0

时间:2015-01-29 12:49:20

标签: batch-file msbuild wix signtool

在我们当前的设置构建过程(WiX 3.9)中,某些文件经过数字签名。为避免再次签署unchange文件,我想检查每个文件是否有签名,如果已经签名则跳过签名。

我尝试使用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,但这不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

作为S.T.如上所述,只需在exit /b 0标签下添加:finished即可。如果您想在不退出脚本的情况下重置%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

)

>NUL 2>&1内容只隐藏signtool.exe的所有stdout和stderr输出。如果&&退出,则signtool触发后的代码块。否则,||之后的代码块将触发。