Форум программистов, компьютерный форум, киберфорум
Наши страницы

Batch (CMD/BAT)

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.86
Dragokas
Эксперт WindowsАвтор FAQ
16600 / 6985 / 845
Регистрация: 25.12.2011
Сообщений: 10,781
Записей в блоге: 16
#1

ERRORLEVEL это не %ERRORLEVEL% [Статья] - CMD/BAT

07.06.2013, 01:02. Просмотров 2871. Ответов 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% [Статья] (CMD/BAT):

Проверка %ERRORLEVEL% - CMD/BAT
Добрый день! Помогите пожалуйста. После запуска команды необходимо сделать проверку %ERRORLEVEL%. Если без ошибок, то значение 0,...

%ERRORLEVEL% в Windows Embedded CE 6.0 - CMD/BAT
@echo off set count=0 :begin set /A count=count+1 ping localhost -n 10 ping -n 1 -w 3000 192.168.9.1 if %errorlevel%==1 goto...

Обработка значения ERRORLEVEL - CMD/BAT
есть скриптик, кусок его прилагаю errorlevel выдает 17, хотя должен по моему мнению 1 т.к.конечного пути \a\1\ не существует но даже если...

Обработка значения ERRORLEVEL - CMD/BAT
Привет всем! Столкнулся с проблемой обработки значения errorlevel. Вызываю внешний скрипт call script1.bat %параметры% Внутри...

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

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

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

Errorlevel 9009 при выполнении dsmod - CMD/BAT
при выполнении: set login=%username% for /f "delims=xxx" %%a in ('findstr %login% AD_Account.txt') do set a=%%a set a=%a:~20,50% ...

Удаленный запуск и остановка служб PsService: вне зависимости от состояние службы ERRORLEVEL всегда 1 - CMD/BAT
Доброго дня Необходимо запуск и остановка служб Win XP удаленно. Имеется такой батник: @ECHO off start C:\psservice \\192.168.3.1...

Циклические операции и примеры (команда FOR) * [Статья] - CMD/BAT
Вдохновившись сообщением от FraidZZ, написал мини-статейку, основанную на изложенных ним положениях. Заметки Циклическиe операции...

Настройка интерфейса и эффективное использование CMD [Статья] - CMD/BAT
Статья от 27.10.2013 Автор: Dragokas 1. Настройка интерфейса и эффективное использование CMD. 1.1. Управление мышкой. 1.2....


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

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

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