Каков самый простой способ сбросить ERRORLEVEL до нуля?
У меня есть событие после сборки, которое запускает некоторые команды для проекта c#. Последняя команда иногда вызывает значение ERRORLEVEL не равно нулю, а затем сборка завершается ошибкой.
Я хочу добавить дополнительную строку команды, чтобы всегда устанавливать значение ERRORLEVEL в ноль. Как это сделать наиболее удобно?
10 ответов
Если вы используете exit /b 0
вы можете вернуть errorlevel 0
из дочернего пакетного сценария без выхода из родительского.
Кажется, сделать трюк:
ver > nul
Не все работает, и непонятно почему. Например, следующие не делают:
echo. > nul
cls > nul
в событии до или после сборки, если код возврата исполняемого файла больше нуля, и вызов исполняемого файла не является последней строкой события до или после сборки, быстрый способ отключить его и избежать запуска проверки на ненулевое errorlevel
должен следовать за неудачной линией с линией, которая явно возвращает ноль:
cmd /c "exit /b 0"
это по существу общая комбинация ранее упомянутых решений, которые будут работать с более чем просто последние строка события до или после сборки.
Я обнаружил, что "выход 0" выглядит как хороший способ, чтобы справиться с этой проблемой.
Пример Использования:
NET STOP UnderDevService / Y
выход 0
Если служба UnderDevService не запущена.
Я лично использую этот:
cd .
работает даже в оболочке unix.
но этот может быть немного быстрее:
type nul>nul
, потому что Process Monitor
показывает QueryDirectory
звонки cd .
PS:
cd .
есть еще один приятный побочный эффект в оболочке Unix. Он восстанавливает воссозданный рабочий каталог в терминале, если он был открыт до стирания.
если это фрагмент, такой как "событие после сборки" и т. д. тогда вы будете в порядке добавления:
(...) || ver > nul
в конце последней команды.
как вариант
cmd /c "exit /b 0"
очень чистый и неидиоматический-читатель, который знает оболочку Windows, будет знать, что происходит, и что было вашим намерением.
однако, если вы находитесь в пакетном скрипте, вы можете использовать субротины, которые являются легким эквивалентом "дочернего пакетного скрипта" из akf ответ.
есть подпрограмма:
:reset_error
exit /b 0
и только потом
call :reset_error
везде, где вам это нужно.
вот пример:
@echo off
rem *** main ***
call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%
call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%
call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%
:: this is needed at the end of the main body of the script
goto:eof
rem *** subroutines ***
:empty
goto:eof
:raise_error
exit /b 1
:reset_error
exit /b 0
выходы:
After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
Как видите - просто позвонить и вернуться через goto: eof недостаточно.
добавить >nul
после каждой команды, которая может завершиться неудачей - это, похоже, предотвращает сбой сборки.
вы все еще можете проверить результат команды, изучив %errorlevel%
.
например:
findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)