Как предотвратить прерывание работы MSBuild на уровне ошибки signtool ‹› 0

В нашем текущем процессе сборки установки (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 код возврата из пакетного файла подписи. Однако с точки зрения процесса сборки не было ошибок, которые нужно было бы рассматривать как ошибки.

Я уже пытался сбросить ERRORLEVEL на 0 после вызова signtool verify, но это не работает. Любые идеи?


person Hannes    schedule 29.01.2015    source источник
comment
Как сбросить ERRORLEVEL? Один из способов игнорировать любые ошибки в командном файле — поставить exit /b 0 в конце. Работает ли это для вас?   -  person seva titov    schedule 29.01.2015


Ответы (1)


Как С.Т. предлагает выше, просто добавьте exit /b 0 под ярлыком :finished. Если вы хотите сбросить %ERRORLEVEL%, не выходя из скрипта, вы можете сделать cmd /c exit /b 0, тогда %ERRORLEVEL% будет сброшено на ноль, и ваш скрипт продолжит работу.


Просто чтобы я почувствовал, что приложил некоторые усилия к этому ответу, я дам несвязанный совет. :)

Еще один изящный прием для проверки состояния кода выхода — условное выполнение.

>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 выходит из 0. В противном случае срабатывает кодовый блок после ||.

person rojo    schedule 29.01.2015