Форум программистов, компьютерный форум, киберфорум
Наши страницы
Batch (CMD/BAT)
Войти
Регистрация
Восстановить пароль
 
Dragokas
Эксперт WindowsАвтор FAQ
16969 / 7054 / 856
Регистрация: 25.12.2011
Сообщений: 10,868
Записей в блоге: 16
#1

ERRORLEVEL это не %ERRORLEVEL% [Статья]

07.06.2013, 01:02. Просмотров 3251. Ответов 0
Метки нет (Все метки)

Статья "ERRORLEVEL это не %ERRORLEVEL%"
Оригинал от Raymond Chen: http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx
Перевод: http://habrahabr.ru/post/41028/

Мои комментарии к статье с примерами:

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

Bash
1
2
3
4
5
@echo off
Setlocal DisableExtensions
CMD /C EXIT 3
echo %errorlevel%
pause
ERRORLEVEL это не %ERRORLEVEL% [Статья]


Полезняшка:
Поскольку ErrorLevel - является командой, а не переменной.
Для ее работы не требуется использовать отложенное расширение переменных среды.
Значит, в циклах, под скобками или в однострочной команде можно писать просто:

Bash
1
2
3
4
(
  CMD /C EXIT 2
  if errorlevel 1 (echo Ошибка) else (echo Успех)
)
В примере ниже использованы 2 способа раскрытия + сравнение через команду errorlevel:
Bash
1
2
3
4
5
6
7
8
9
10
11
@echo off
Setlocal EnableDelayedExpansion
(
CMD /C EXIT 3
  if errorlevel 3 echo errorlevel as Command is CATCHED
  if %errorlevel%==3 echo %%errorlevel%% is CATCHED
  if !errorlevel!==3 echo DelayedExpansion errorlevel is CATCHED
)
echo.
CMD /C EXIT 4& if errorlevel 3 echo errorlevel = 3 или больше
pause
ERRORLEVEL это не %ERRORLEVEL% [Статья]


Bash
1
2
3
4
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 тоже возвращает после своего выполнения код возврата. Он = 0.
Проверим?

Bash
1
2
3
CMD /C EXIT 5
set ERRORLEVEL=1
if ERRORLEVEL 5 echo Does this print?
В ответ ничего не получим. Т.к. настоящий код возврата (не переменная) = 0.

Главные выводы:

1) Переменная %ERRORLEVEL% и код возврата ошибки - это не всегда одно и тоже.

2) IF ERRORLEVEL N - это команда, которая дает TRUE, если код возврата ошибки при выполнении предыдущей команды >= N, где N - это число (не переменная).

3) Если включен режим расширения для команд (а он включен по-умолчанию), то
%errorlevel% = сначала процессор смотрит определена ли переменная, иначе получает код возврата ошибки.

4) Такие команды как if, echo... не влияют на код ошибки.

5) Командой ErrorLevel удобно сравнивать код возврата ошибки внутри скобок, циклов, однострочной команде,
т.к. не нужно использовать конструкцию !errorlevel!, а это дает дополнительный прирост в скорости работы.

6) Конструкции вида if %errorlevel%==0 нужно использовать с осторожностью, т.к. отключенный в реестре пользователя режим расширения команд приведет к падению работы скрипта.
Обязательно используйте кавычки: if "%errorlevel%"=="0" или не забывайте принудительно включать директиву SetLocal EnableExtensions в пакетный файл.
6
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.06.2013, 01:02
Ответы с готовыми решениями:

Проверка %ERRORLEVEL%
Добрый день! Помогите пожалуйста. После запуска команды необходимо сделать...

Обработка значения ERRORLEVEL
есть скриптик, кусок его прилагаю errorlevel выдает 17, хотя должен по моему...

%ERRORLEVEL% в Windows Embedded CE 6.0
@echo off set count=0 :begin set /A count=count+1 ping localhost -n 10 ...

Обработка значения ERRORLEVEL
Привет всем! Столкнулся с проблемой обработки значения errorlevel. Вызываю...

Получение ERRORLEVEL команды TASKKILL
Здравствуйте. В системе периодически запускается скрипт, работа которого...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.06.2013, 01:02

Коды возврата ошибок (расшифровки ErrorLevel)*
Коды возврата ошибок (встроенных команд и других программ) Для новичков -...

Errorlevel 9009 при выполнении dsmod
при выполнении: set login=%username% for /f "delims=xxx" %%a in ('findstr...

Вывести текст ошибки по значению errorlevel в bat
Добрый день, товарищи! Появилась необходимость записывать в log-файлы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru