在我们当前的设置构建过程(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,但这不起作用。有什么想法吗?
答案 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
触发后的代码块。否则,||
之后的代码块将触发。