У меня есть командный файл, который является оберткой вокруг установщика. Этот пакетный файл проверяет уровень ошибок, возвращаемый установщиком, и печатает соответственно.
Я заметил, что если я выполню set ERRORLEVEL=0
в командной строке прямо перед тем, как запустить пакетный файл (в том же окне / среде команды), установщик никогда не помешает уровню ошибки, и мой пакетный скрипт всегда возвращает пройденный. Я бы предположил, %ERRORLEVEL%
что это переменная, определяемая Windows, которая используется специально для распечатки ошибок из программ и сценариев, и что использование переменной в командном файле или что-то еще будет «на ваш страх и риск», поскольку его можно изменить в любой момент другой процесс.
Из того, что кажется, когда я устанавливаю уровень ошибки в данной среде, это как-то прекращает использование уровня ошибок в качестве держателя кода выхода. Кто-нибудь знает, почему это? Для меня это просто странное неожиданное поведение. Любая информация по этому вопросу будет принята с благодарностью!
источник
&&
ни||
.Ответы:
Вы переопределяете системную переменную в обычную. Когда вы сделаете это, система не будет использовать его, пока командный сеанс не будет закрыт.
Лучший способ будет использовать
в другой пакетный файл и вызвать его из основного сценария. Где число 0 - это то, что вам нужно
errorlevel
. Либо так, либо используйте команду, которая сбрасываетerrorlevel
для вас, например, echo, findstr и т. Д.Например, следующие команды будут все установлены
ERRORLEVEL
в 0 в вашем пакетном файле:источник
set "errorlevel="
errorlevel
переменная была «вручную» установлена пользователем / партией с помощью"set errorlevel=0"
,errorlevel
переменная больше не будет отражать код выхода, но вы все равно можете получить доступ к коду завершения с помощьюif errorlevel do something
.cmd /c exit 42
кажется лучшим ответом на это. (2) Как указывает Дбенхем , вам не нужны/b
ни кавычки, ни цитаты.Никогда не следует присваивать собственное значение динамическим системным переменным, таким как ERRORLEVEL, PATH, CD, DATE, TIME и т. Д. Это не позволит коду видеть динамическое значение. Вы можете восстановить динамическое значение, просто отменив определенное пользователем значение. Например:
Если вы хотите , чтобы заставить ErrorLevel в 0, то вы можете использовать это абсолютно не интуитивный, но очень эффективный синтаксис:
(call )
. Пробел после звонка имеет решающее значение. Если вы хотите установить уровень ошибки на 1, вы можете использовать(call)
. Очень важно, чтобы после звонка не было места.Более интуитивно понятный, но менее удобный метод установки уровня ошибки - это использование выделенной подпрограммы в пакетном файле:
Или, если в командной строке, вы можете использовать
источник
Я лично использую это:
cd .
Работает даже в Unix Shell.
источник
type nul>nul
потому что Process Monitor показываетQueryDirectory
вызовы наcd .
PS:cd .
имеет еще один приятный побочный эффект в оболочке Unix. Он восстанавливает воссозданный рабочий каталог в терминале, если он был открыт до стирания.Вот некоторые другие способы сброса
ErrorLevel
состояния, которые даже работают в MS-DOS (по крайней мере для версии 6.22):Следующие методы работают только в MS-DOS:
Для полноты картины устанавливается
ErrorLevel
состояние1
, действительное как для Windows, так и для MS-DOS:источник
Это единственное, что я нашел, что работает.
Требуется в скрипте, который использует сторонний скрипт, который обнаруживает ERRORLEVEL, но не сбрасывает уровень ошибки самостоятельно.
источник
Это также будет работать: (Устанавливает errorlevel в 1)
Способ 1
Способ 2
Вы также можете использовать это, чтобы установить уровень ошибки 1-26:
источник