Как правильно обрабатывать коды возврата из программ с помощью 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
|
|
Комментарии
*************** *****
C:>help if
Оператор условного выполнения команд в пакетном файле.
...
ERRORLEVEL число Условие является истинным, если код возврата последней
выполненной программы не меньше указанного числа.
*************** *****
Ключевое слово здесь - "не меньше ". Т.О. второй пример тоже будет работать некорректно - с кодом ошибки 4 уйдёт по 1-му GOTO :-(
Начинать проверку надо снаибольшего из возможных. А "if errorlevel 0" ваще не имеет смысла, ибо всегда истинно.
С уважением, Андрей.
microsin: благодарю, Андрей, за ценное исправление моей ошибки - Вы совершенно правы. Расставили все точки над i, просто и ясно. Похоже, статью надо снимать с публикации или переписывать. Остается только гадать, почему Microsoft придумала такую (как бы помягче сказать, э...) неочевидную логику работы команды IF ERRORLEVEL.
RSS лента комментариев этой записи