встановлення ERRORLEVEL на 0


14

У мене є пакетний файл, який є обгорткою навколо інсталятора. Цей пакетний файл перевіряє рівень помилки, який повертає інсталятор, і друкує відповідно.

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

З того, що це здається, коли я встановлюю рівень помилок у даному середовищі, то якимось чином припиняє використання рівня помилок як власника коду виходу. Хтось знає, чому це? Для мене це просто дивна несподівана поведінка. Будь-яка інформація з цього питання буде дуже вдячна!


Відповіді:


14

Ви переосмислюєте системну змінну в звичайну. Коли ви це зробите, система не буде використовувати його, поки сеанс команд не буде закритий.

Найкращим способом було б користуватися

exit /b 0

в іншому пакетному файлі і викликайте його з вашого основного сценарію. Де число 0 - це ваше розшук errorlevel. Або це, або використовуйте команду, яка скидає errorlevelдля вас, наприклад, echo, findstr тощо.

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

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
Майже правильно. Ви можете отримати "систему" для використання динамічної ERRORLEVEL, просто визначивши будь-яке визначене користувачем значення, використовуючиset "errorlevel="
dbenham

Чому Windows дозволяє комусь переосмислити системну змінну у звичайну? Чи існують обидва визначення, його просто відлуння та інші такі команди тепер вказують на звичайне? Отже, програми все ще можуть оновлювати системну змінну, її просто недоступно через командний рядок?
користувач972276

1
"Або це, або використовуйте команду, яка скидає для вас рівень помилок, наприклад, echo, findstr тощо". Команда echo не скидає змінну рівня помилок.
antred

Як вже говорили інші, якщо errorlevel змінна була встановлена ​​користувачем / партією "вручну" "set errorlevel=0", errorlevelзмінна більше не відображатиме код виходу, але ви все одно можете отримати доступ до коду виходу if errorlevel do something.
Кевін Феган

(1) Більш загальне питання - "Як встановити ERRORLEVEL на якесь довільне значення, наприклад, 42?"  cmd /c exit 42 здається, найкраща відповідь на це. (2) Як  вказує dbenham , вам не потрібні  /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%

8

Я особисто це використовую:

cd .

Працює навіть в оболонці Unix.


Але це може бути трохи швидше: 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 ""

1

Це єдине, що я знайшов, що працює.

call (exit /b 0)

Він потрібен у скрипті, який використовує сторонній скрипт, який виявляє ERRORLEVEL, але не скидає рівень помилок на самооцінку.


0

Вони також спрацюють: (Встановлює рівень помилок на 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.