Администрирование Windows Как правильно обрабатывать коды возврата из программ с помощью ERRORLEVEL Thu, September 21 2017  

Поделиться

нашли опечатку?

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


Как правильно обрабатывать коды возврата из программ с помощью ERRORLEVEL Печать
Добавил(а) microsin   

Раньше я не знал, как правильно использовать в командных файлах (расширение .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

 

Комментарии  

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

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

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


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

Top of Page