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

14

У меня есть командный файл, который является оберткой вокруг установщика. Этот пакетный файл проверяет уровень ошибок, возвращаемый установщиком, и печатает соответственно.

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

Из того, что кажется, когда я устанавливаю уровень ошибки в данной среде, это как-то прекращает использование уровня ошибок в качестве держателя кода выхода. Кто-нибудь знает, почему это? Для меня это просто странное неожиданное поведение. Любая информация по этому вопросу будет принята с благодарностью!

user972276
источник

Ответы:

14

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

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

exit /b 0

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

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

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
источник
2
Почти правильно. Вы можете заставить «систему» ​​использовать динамический ERRORLEVEL, просто отменив любое пользовательское значение, используяset "errorlevel="
dbenham
Почему Windows позволяет кому-то переопределить системную переменную в обычную? Оба определения все еще существуют, его просто echo и другие подобные команды теперь указывают на обычное? Таким образом, программы все еще могут обновлять системную переменную, она просто недоступна из командной строки?
user972276 23.09.13
1
«Либо это, либо используйте команду, которая сбрасывает уровень ошибки для вас, например, echo, findstr и т. Д.» Команда echo не сбрасывает переменную errorlevel.
antred
Как уже говорили другие, если errorlevel переменная была «вручную» установлена ​​пользователем / партией с помощью "set errorlevel=0", errorlevelпеременная больше не будет отражать код выхода, но вы все равно можете получить доступ к коду завершения с помощью if errorlevel do something.
Кевин Феган
(1) Более общий вопрос: «Как установить для ERRORLEVEL какое-то произвольное значение, например 42?»  cmd /c exit 42 кажется лучшим ответом на это. (2) Как  указывает Дбенхем , вам не нужны  /bни кавычки, ни цитаты.
Скотт
12

Никогда не следует присваивать собственное значение динамическим системным переменным, таким как 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%
dbenham
источник
8

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

cd .

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

Andry
источник
Но этот может быть немного быстрее: type nul>nulпотому что Process Monitor показывает QueryDirectoryвызовы на cd .PS: cd .имеет еще один приятный побочный эффект в оболочке Unix. Он восстанавливает воссозданный рабочий каталог в терминале, если он был открыт до стирания.
Андри
2

Вот некоторые другие способы сброса 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 ""
aschipfl
источник
1

Это единственное, что я нашел, что работает.

call (exit /b 0)

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

Ричард Медоуз
источник
0

Это также будет работать: (Устанавливает errorlevel в 1)

Способ 1

color 00

Способ 2

echo A | find "B"

Вы также можете использовать это, чтобы установить уровень ошибки 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Васиф хасан
источник