Каков самый простой способ сбросить 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 не запущена.


Я использую VERIFY или VERIFY > nul


Я лично использую этот:

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)

Я использую этот:

ping localhost-n 1 >null


Я всегда просто использовать;

set ERRORLEVEL=0

Я использую его в течение многих лет осла.