У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды
Проверка
Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем
Сообщение не будет отображено, поскольку переменная
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет
То же поведение и у
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
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%.