Как стать автором
Обновить

ERRORLEVEL это не %ERRORLEVEL%

Время на прочтение2 мин
Количество просмотров99K
Автор оригинала: Raymond Chen
У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды IF ERRORLEVEL.

IF ERRORLEVEL 1 ECHO error level is 1 or more

<sidebar>
Проверка IF ERROR LEVEL n срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
</sidebar>

Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем ERRORLEVEL, так же, как вы можете создать переменную с именем FRED. Но, как и FRED, эта переменная не повлияет на уровень ошибки.

rem this next command sets the error level to zero
CMD /C EXIT 0
set ERRORLEVEL=1
if ERRORLEVEL 1 echo Does this print?


Сообщение не будет отображено, поскольку переменная ERRORLEVEL не имеет никакого влияния на уровень ошибки. Это просто переменная, имя которой совпадает с концепцией командного процессора.

set BANKBALANCE=$1 000 000,00

«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».

Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете %ERRORLEVEL%.
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет %ERRORLEVEL% на текущее значение внутреннего уровня ошибки. Это запасной вариант — как указать адрес соседа запасным адресом доставки товара, на случай, если вас нет дома. Однако это не повлияет на посылки, доставляемые соседу.

То же поведение и у %CD%: если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:\Windows нельзя.

Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!

Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Теги:
Хабы:
Всего голосов 22: ↑17 и ↓5+12
Комментарии10

Публикации

Истории

Работа

Ближайшие события

Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн
Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург