установив ERRORLEVEL в 0

27219
user972276

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

11

4 ответа на вопрос

10
TwirlMandarin

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

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

выход / б 0

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

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

VERIFY > nul  cmd /c "exit /b 0"  ver > nul  
Почти правильно. Вы можете заставить "систему" использовать динамический ERRORLEVEL, просто отменяя определение любого пользовательского значения, используя `set" errorlevel = "` dbenham 11 лет назад 1
Почему Windows позволяет кому-то переопределить системную переменную в обычную? Оба определения все еще существуют, его просто echo и другие подобные команды теперь указывают на обычное? Таким образом, программы все еще могут обновлять системную переменную, она просто не доступна через командную строку? user972276 11 лет назад 0
«Либо это, либо используйте команду, которая сбрасывает уровень ошибки для вас, например, echo, findstr и т. Д.» Команда echo __not__ сбрасывает переменную errorlevel. antred 9 лет назад 1
Как уже говорили другие, если переменная `errorlevel` *** *** была" вручную "установлена ​​пользователем / партией с помощью` "set errorlevel = 0" `, переменная` errorlevel` больше не будет отражать код выхода , но вы по-прежнему можете получить доступ к коду выхода с помощью `if errorlevel сделать что-нибудь`. Kevin Fegan 8 лет назад 0
9
dbenham

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

set "errorlevel=" 

Если вы хотите, чтобы заставить 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
Andry

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

cd .

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

0
Richard Meadows

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

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