У меня есть командный файл, который снова и снова вызывает один и тот же исполняемый файл с разными параметрами. Как сделать так, чтобы он немедленно завершился, если один из вызовов возвращает код ошибки любого уровня?
По сути, я хочу эквивалент MSBuild ContinueOnError=false
.
batch-file
Джош Кодрофф
источник
источник
Ответы:
Проверьте
errorlevel
вif
заявлении, а затемexit /b
(выход из б файла ATCH только, а не весь процесс cmd.exe) для отличных 0 значений.Если вы хотите, чтобы значение уровня ошибки распространялось за пределы вашего пакетного файла
но если это внутри,
for
это становится немного сложнее. Вам понадобится что-то похожее на:Изменить: Вы должны проверить ошибку после каждой команды. В пакете cmd.exe / command.com нет общего типа конструкции «при ошибке». Я также обновил свой код для CodeMonkey , хотя я никогда не сталкивался с отрицательным уровнем ошибок ни в одном из моих пакетных операций на XP или Vista.
источник
neq
) включены / отключены, не имеет значения при использовании,if not errorlevel 1 exit /B
как объяснено Microsoft в статье поддержки Использование операторов перенаправления команд и при выводе справки при запускеif /?
в окне cmd. Текущий уровень ошибки (код выхода) сохраняется при выходе из обработки командного файла с помощьюexit /B
. Примечание: дляexit
параметра/B
требуются включенные расширения команд, см. Куда возвращается GOTO: EOF?Добавьте
|| goto :label
к каждой строке, а затем определите:label
.Например, создайте этот файл .cmd:
Смотрите также вопрос о выходе из подпрограммы пакетного файла .
источник
command || (SET ErrorLine=102 && goto :error)
||
было создано в первую очередь. Может быть, не goto конкретно, но "попробуй, сделай это по ошибке", как упоминал Фаул. Мой вопрос: это работает для всех ненулевых кодов выхода? Только положительные?cmd /k exit -1 && echo success || echo fail
- печать не удалась .command || exit /b %errorlevel%
Кратчайший:
Если вам нужно, вы можете установить код выхода:
И вы также можете войти:
источник
%ERRORLEVEL%
остается нетронутым, когда вы звонитеexit /b
, поэтому код ошибки перенаправляетсяОдно незначительное обновление, вы должны изменить проверки «if errorlevel 1» на следующее ...
Это потому, что в XP вы можете получить отрицательные числа как ошибки. 0 = нет проблем, все остальное - проблема.
И помните, как DOS обрабатывает тесты «IF ERRORLEVEL». Он вернет true, если номер, который вы проверяете, это число или больше, поэтому, если вы ищете конкретные номера ошибок, вам нужно начать с 255 и продолжить работу.
источник
Вот программа polyglot для BASH и Windows CMD, которая выполняет серию команд и завершает свою работу в случае сбоя любой из них:
Я использовал этот тип вещей в прошлом для сценария непрерывной интеграции для нескольких платформ .
источник
Я предпочитаю форму команды ИЛИ, так как считаю ее наиболее читаемой (в отличие от наличия if после каждой команды). Однако наивно способ сделать это,
command || exit /b %ERRORLEVEL%
является неправильным .Это связано с тем, что пакетное развертывание переменных происходит при первом чтении строки, а не при их использовании. Это означает, что если
command
в приведенной выше строке произойдет сбой, пакетный файл завершится правильно, но завершится с кодом возврата 0, потому что это значение, которое%ERRORLEVEL%
было в начале строки. Очевидно, что это нежелательно в нашем скрипте, поэтому мы должны включить отложенное расширение , например:Этот фрагмент будет выполнять команды 1-4, и в случае сбоя любой из них он завершится с тем же кодом завершения, что и неудачная команда.
источник
Мы не всегда можем зависеть от ERRORLEVEL, потому что много раз внешние программы или пакетные сценарии не возвращают коды завершения.
В этом случае мы можем использовать общие проверки для сбоев, как это:
И если программа выводит что-то на консоль, мы можем это проверить.
источник
Независимо от того, как я пытался, уровень ошибки всегда остается 0, даже если msbuild не удалось. Итак, я построил мой обходной путь:
Создайте проект и сохраните журнал в Build.log
искать строку «0 Error» в журнале сборки, установить результат в var
получить последний символ, который указывает, сколько строк содержит строку поиска
если строка не найдена, то ошибка> 0, сборка не удалась
Это решение было вдохновлено постом Mechaflash в разделе Как настроить вывод команд в качестве переменной в командном файле
и https://ss64.com/nt/syntax-substring.html
источник
for /f %%F in ('type build.log^|find /c /i "0 Error") do set result=%%F
, Примечание:find "0 Error"
также найдете10 Errors
.источник