У меня есть командный файл, который является оберткой вокруг установщика. Этот пакетный файл проверяет уровень ошибок, возвращаемый установщиком, и печатает соответственно. Я заметил, что если я выполню set ERRORLEVEL=0
в командной строке непосредственно перед тем, как запустить пакетный файл (в том же командном окне / окружении), программа установки никогда не помешает уровню ошибки, и мой пакетный скрипт всегда возвращает пройденное. Я бы предположил, что% ERRORLEVEL% - это переменная, определяемая окнами, которые используются специально для распечатки ошибок из программ и сценариев, и что использование переменной в пакетном файле или что-то еще будет «на ваш страх и риск», поскольку его можно изменить в любой момент другим процессом. Из того, что кажется, когда я устанавливаю уровень ошибки в данной среде, он как-то прекращает использование уровня ошибок в качестве держателя кода выхода. Кто-нибудь знает почему это? Для меня это просто странное неожиданное поведение. Любая информация по этому вопросу будет принята с благодарностью!
5 ответов
Вы переопределяете системную переменную в обычную. Когда вы сделаете это, система не будет использовать его, пока командный сеанс не будет закрыт.
Лучший способ будет использовать
выход / б 0
в другой пакетный файл и вызвать его из основного сценария. Где число 0 - это ваш требуемый уровень ошибки. Либо так, либо используйте команду, которая сбрасывает уровень ошибки для вас, например, echo, findstr и т.д.
Например, следующие команды установят для ERRORLEVEL значение 0 в вашем пакетном файле:
VERIFY > nul
cmd /c "exit /b 0"
ver > nul
Никогда не следует присваивать свое собственное значение динамическим системным переменным, таким как 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%
Я лично использую это:
cd .
Работает даже в Unix Shell.
Это единственное, что я нашел, что работает.
вызов (выход / б 0)
Требуется в скрипте, который использует сторонний скрипт, который обнаруживает ERRORLEVEL, но не сбрасывает уровень ошибки самостоятельно.
Вот некоторые другие способы сброса состояния 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 ""