Вопрос по batch-file, windows, cmd, errorlevel – Какой самый простой способ сбросить ERRORLEVEL на ноль?

60

У меня есть событие после сборки, которое запускает некоторые команды для проекта c #. Последняя команда иногда приводит к тому, что значение ERRORLEVEL не равно нулю, и сборка завершается неудачно.

Я хочу добавить дополнительную строку команды, чтобы всегда устанавливать значение ERRORLEVEL в ноль. Какой самый удобный способ сделать это?

Я понимаю, что это довольно старая публикация ... Мне удалось сбросить уровень ошибки до 0, введя команду "тип nul" после последней команды. Просто чувствовал, что это может быть полезно. Arun
Сборка действительно не дает сбоя, только IDE выглядит так. Dykam

Ваш Ответ

11   ответов
17

что "выход 0" похоже, хороший способ справиться с этой проблемой.

Пример использования:

NET STOP UnderDevService /Y

exit 0

если служба UnderDevService не запущена.

нет, если вы также хотите запустить этот командный файл из командной строки, так как выход 0 закроет окно. cmd / c "выход / b 0" как предложено ниже, намного лучше
60

exit /b 0 Вы можете вернутьerrorlevel 0 из дочернего пакетного сценария без выхода из родительского.

Из всех предложенных решений это, вероятно, будет лучшим. Я собираюсь бросить эту строку вresetErrorlevel.bat скрипт. В общем, тот факт, что нужно пойти на все, чтобы сделать что-то тривиальное, например, очистить уровень ошибок скрипта, является еще одним доказательством того, что изобретатель пакетного программирования Windows должен быть найден и наказан строго. ;)
8

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

cd .

Работает даже в Unix Shell.

Но этот может быть немного быстрее:

type nul>nul

Так какProcess Monitor шоуQueryDirectory призываетcd .

PS: cd . имеет еще один приятный побочный эффект в оболочке Unix. Он восстанавливает воссозданный рабочий каталог в терминале, если он был открыт до стирания.

-1

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

ping localhost -n 1 & gt; null

Также популярен как команда сна, когда n & gt; 1.
-4

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

set ERRORLEVEL=0

Я использую его уже много лет.

Это легко, но это действительно плохая идея, так как это создает переменную с именемerrorlevel который перекрывает внутреннюю псевдопеременнуюerrorlevel
Здесь же Cirrus! спасибо, джеб!
Крики, ты прав! Ух ты, похоже, я уже несколько лет уклоняюсь от пуль :)
6

я используюVERIFY или жеVERIFY > nul

2

Если это фрагмент кода, такой как «Событие после сборки», quot; и т. д., тогда вы будете в порядке, добавив:

(...) || ver > nul

в конце последней команды.

альтернативно

cmd /c "exit /b 0"

очень чистый и не идиоматичный - читатель, который знает оболочку Windows, будет знать, что происходит и каковы были ваши намерения.

Однако, если вы находитесь в пакетном скрипте, вы можете использовать подпрограммы, которые являются легким эквивалентом «дочернего пакетного скрипта». из ответа Акфа.

Есть подпрограмма:

: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 недостаточно.

0

Вот некоторые другие способы сбросаErrorLevel состояния, которые даже работают в MS-DOS (по крайней мере, для версии 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Следующие методы работают только в MS-DOS:

command /? > nul

fc nul nul > nul

Для полноты картины это устанавливаетErrorLevel состояние для1, действительно для Windows и MS-DOS:

< nul find ""
27

В случае события до или после сборки, если код возврата исполняемого файла больше нуля, и вызов исполняемого файла не является последней строкой события до или после сборки, можно быстро отключить его и избежать запуск проверки на ненулевоеerrorlevel должен следовать за ошибочной строкой строкой, которая явно возвращает ноль:

cmd /c "exit /b 0"

По сути, это общая комбинация ранее упомянутых решений, которая будет работать с более чемjust последняя строка события до или после сборки.

/b не нужно такcmd /c “exit 0” тоже отлично работает.
спасибо, это сработало для меня. более легкое звучание «выхода 0»; выше не сокращает его, так как я хочу продолжать делать вещи после сброса уровня ошибки, а не выхода
Мне нравится этот метод дляsetting произвольный уровень ошибки, такой как:cmd /c "exit /b 9009", но это кажется немного излишним для установки его в 0. Не будетver > nul (внутренняя команда), работает так же хорошо с меньшими накладными расходами, чем загрузка другой копии командной оболочки сcmd /c "exit /b 0" ?
еще больше фантазии: вы можете использовать<some failing command> || cmd /c "exit /b 0" как один лайнер.
0

добавлять>nul после каждой команды, которая может дать сбой - это предотвращает сбой сборки.

Вы все еще можете проверить результат команды, изучив%errorlevel%.

Например:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
Это не сработает - оболочка оценивает всю командную строку сразу, поэтому% errorlevel% будет подставлен перед "findstr". Команда выполнена. Используйте & quot; если errorlevel 1 & quot; вместо этого, чтобы проверить ненулевой уровень ошибки.
Возможно, ваш CI-сервер отказывает в сборке, если, например, он находит строку & quot; error & quot; в стандартном выводе / стандартная ошибка. Вы не сбрасываете статус. Вы просто заставляете команду замолчать. Для более глубокого молчания используйте & gt; nul 2 & gt; nul
45

Кажется, чтобы сделать трюк:

ver > nul

Не все работает, и не понятно почему. Например, следующие не делают:

echo. > nul
cls > nul
Я думаю, что причина "эха" и "cls" не работают, потому что они являются встроенными командами оболочки, а не реальными программами. user95319
если вы запустите команду help в командной оболочке, вы увидите, что ver также является встроенной командой
В командной строке пакета "ver" возвращает версию MS Windows, например «Microsoft Windows [Версия 6.1.7601]».
Я дам вам это, но где же ver.exe?
@BaiyanHuang - я почти уверен"ver" это внутренняя команда, но как вы можете сказать из"help" ? Многие из команд, перечисленных в"help" являются "внешними" такие команды, как:Find.exe, Findstr.exe, Help.exe, Subst.exe, Wmic.exe, Xcopy.exe, ...

Похожие вопросы