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

ERRORLEVEL это не %ERRORLEVEL%

Разработка под Windows
Перевод
Автор оригинала: 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%.
Теги:the old new thingwindowscmd.exe
Хабы: Разработка под Windows
Всего голосов 22: ↑17 и ↓5 +12
Просмотры42.9K

Комментарии 10

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Похожие публикации

Senior .NET Core Developer
до 350 000 ₽IT X100Можно удаленно
Системный администратор (технологии Microsoft)
от 80 000 до 120 000 ₽НПК «Катрен»Новосибирск
Разработчик под iOS (Swift)
от 100 000 ₽eKassirСанкт-Петербург
Разработчик под Android (Kotlin)
от 100 000 ₽eKassirСанкт-Петербург
Системный администратор
от 85 000 ₽ActimindСанкт-Петербург

Лучшие публикации за сутки