11

У меня есть командный файл, который является оберткой вокруг установщика. Этот пакетный файл проверяет уровень ошибок, возвращаемый установщиком, и печатает соответственно. Я заметил, что если я выполню set ERRORLEVEL=0 в командной строке непосредственно перед тем, как запустить пакетный файл (в том же командном окне / окружении), программа установки никогда не помешает уровню ошибки, и мой пакетный скрипт всегда возвращает пройденное. Я бы предположил, что% ERRORLEVEL% - это переменная, определяемая окнами, которые используются специально для распечатки ошибок из программ и сценариев, и что использование переменной в пакетном файле или что-то еще будет «на ваш страх и риск», поскольку его можно изменить в любой момент другим процессом. Из того, что кажется, когда я устанавливаю уровень ошибки в данной среде, он как-то прекращает использование уровня ошибок в качестве держателя кода выхода. Кто-нибудь знает почему это? Для меня это просто странное неожиданное поведение. Любая информация по этому вопросу будет принята с благодарностью!

5 ответов5

10

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

Лучший способ будет использовать

выход / б 0

в другой пакетный файл и вызвать его из основного сценария. Где число 0 - это ваш требуемый уровень ошибки. Либо так, либо используйте команду, которая сбрасывает уровень ошибки для вас, например, echo, findstr и т.д.

Например, следующие команды установят для ERRORLEVEL значение 0 в вашем пакетном файле:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
10

Никогда не следует присваивать свое собственное значение динамическим системным переменным, таким как ERRORLEVEL, PATH, CD, DATE, TIME и т.д. Это не позволит коду видеть динамическое значение. Вы можете восстановить динамическое значение, просто отменив пользовательское значение. Например:

set "errorlevel="

Если вы хотите установить уровень ошибки равным 0, тогда вы можете использовать этот совершенно неинтуитивный, но очень эффективный синтаксис: (call ) . Пробел после звонка имеет решающее значение. Если вы хотите установить уровень ошибки на 1, вы можете использовать (call) . Очень важно, чтобы после звонка не было места.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Более интуитивно понятный, но менее удобный метод установки уровня ошибки - это использование выделенной подпрограммы в пакетном файле:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

Или, если в командной строке, вы можете использовать

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
4

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

cd .

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

0

Это единственное, что я нашел, что работает.
вызов (выход / б 0)

Требуется в скрипте, который использует сторонний скрипт, который обнаруживает ERRORLEVEL, но не сбрасывает уровень ошибки самостоятельно.

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 ""

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .