Главная arrow Администрирование arrow Windows arrow Как правильно обрабатывать коды возврата из программ с помощью ERRORLEVEL Tuesday, May 30 2017  
ГлавнаяКонтактыАдминистрированиеПрограммированиеСсылки
UK-flag-ico.png English Version
GERMAN-flag-ico.png Die deutsche Version
map.gif карта сайта
нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.

Поделиться:

Как правильно обрабатывать коды возврата из программ с помощью ERRORLEVEL Версия для печати
Написал microsin   
28.04.2007

Раньше я не знал, как правильно использовать в командных файлах (расширение .bat) ERRORLEVEL вместе с оператором ветвления IF. Из-за этого у меня возникали ошибки при написании командных файлов.

Статья была переписана после того, как мне в комментарии указали на ошибку. В справке по команде (см. help if) подробно описывается алгоритм работы IF ERRORLEVEL. Команда предназначена для анализа кода возврата последней запущенной из bat-файла программы, и предпринимать по их значениям нужные действия. Чтобы команда работала правильно, нужно начинать проверять коды возврата с наибольших возможных значений, например так:
program0_4.exe
if errorlevel 4 goto error4
if errorlevel 3 goto error3
if errorlevel 2 goto error2
if errorlevel 1 goto error1
goto ok

Есть также возможность прямой проверки значения кода возврата, если использовать в командном файле переменную %ERRORLEVEL% (работает только в том случае, если Вы не умудрились задать переменную окружения с таким же именем). Переменная %ERRORLEVEL% разворачивается в текстовое значение кода возврата, что в позволяет использовать в командном файле конструкции типа:
goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1

 

Старый текст статьи

ERRORLEVEL 0 в командных файлах отрабатывается неправильно 

Предположим, программа program0_4.exe на выходе выдает коды возврата от 0 до 4, и код возврата 0 означает, что ошибок не было. Нужно отфильтровать оператором if факт отсутствия ошибки. В этом случае нельзя использовать проверку if errorlevel 0, так как результат этой проверки не всегда верен. Пример1 не работает, а Пример2 работает нормально.

rem Пример 1 - почему-то иногда НЕ РАБОТАЕТ
program0_4.exe
if errorlevel 0 goto ok
echo "Error!"
goto exit

:ok
echo "O.K."

:exit

rem Пример 2 - работает нормально
program0_4.exe
if errorlevel 1 goto error
if errorlevel 2 goto error
if errorlevel 3 goto error
if errorlevel 4 goto error
goto ok

:ok
echo "O.K."
goto exit

:error
echo "Error!"

:exit

Последнее обновление ( 12.11.2009 )
 

Комментарии  

  1. #4 Константин
    2014-11-0509:44:50
    Цитирую Игорь Шведов:
    Это так теперь обучают работать в DOS? Жалкие крохи былого знания!

    Это утратило свою актуальность.

    microsin: пока жива Windows, BAT-файлы не потеряют актуальности.
  2. #3 Игорь Шведов
    2012-07-2223:07:20 Это так теперь обучают работать в DOS? Жалкие крохи былого знания!
  3. #2 Alexander
    2012-06-1509:25:50 Благодарю, очень полезная информация! Особенно пример с выводом полученного кода возврата. Но есть поправка: после каждого
    > echo Получен код возврата …
    хорошо бы добавить goto end (с меткой :end в конце файла),
    который предотвратит вывод всех остальных нижележащих сообщений
  4. #1 andrey-750
    2009-11-1118:46:11 RTFM!
    *************** *****
    C:>help if
    Оператор условного выполнения команд в пакетном файле.

    ERRORLEVEL число Условие является истинным, если код возврата последней
    выполненной программы не меньше указанного числа.
    *************** *****
    Ключевое слово здесь - "не меньше ". Т.О. второй пример тоже будет работать некорректно - с кодом ошибки 4 уйдёт по 1-му GOTO :-(
    Начинать проверку надо снаибольшего из возможных. А "if errorlevel 0" ваще не имеет смысла, ибо всегда истинно.
    С уважением, Андрей.

    microsin: благодарю, Андрей, за ценное исправление моей ошибки - Вы совершенно правы. Расставили все точки над i, просто и ясно. Похоже, статью надо снимать с публикации или переписывать. Остается только гадать, почему Microsoft придумала такую (как бы помягче сказать, э…) неочевидную логику работы команды IF ERRORLEVEL.

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:

Защитный код
Обновить

< Пред.   След. >

Top of Page
 
microsin © 2017