У командный процессора cmd.exe есть такая вещь — уровень ошибки (error level). Это код выхода (exit code) программы, которую вы запускали последней. Проверить уровень ошибки можно при помощи команды IF ERRORLEVEL .
IF ERRORLEVEL 1 ECHO error level is 1 or more
Проверка IF ERROR LEVEL n срабатывает, если уровень ошибки n или выше. Это, вероятно, потому, что многие программы выражают разную степень ошибки все большими и большими кодах выхода. К примеру, программа diff имеет 3 кода выхода: «0» означает, что файлы одинаковые, «1» — разные, «2» — случилось что-то страшное. Некоторые программы используют код выхода «0» для успеха и все остальное для ошибки.
Вдобавок к этому внутреннему состоянию, вы, если хотите, можете создать переменную окружения с именем ERRORLEVEL , так же, как вы можете создать переменную с именем FRED . Но, как и FRED , эта переменная не повлияет на уровень ошибки.
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 BANKBALANCE=$1 000 000,00
«Эй, когда я пытаюсь снять денег, у меня ошибка — „недостаточно денег на счету“».
Однако, есть вариант, когда включено расширенный режим командного процессора, и вы используете %ERRORLEVEL% .
В этом случае командный процессор ищет переменную с таким именем и, если не находит, заменяет %ERRORLEVEL% на текущее значение внутреннего уровня ошибки. Это запасной вариант — как указать адрес соседа запасным адресом доставки товара, на случай, если вас нет дома. Однако это не повлияет на посылки, доставляемые соседу.
То же поведение и у %CD% : если вы не установили переменную с таким именем, подставляется текущий каталог командного процессора. Но изменить каталог при помощи set CD=C:Windows нельзя.
Вероятно, есть несколько причин для такого поведения:
— Чтобы можно было вывести уровень ошибки в лог:
ECHO error level is %ERRORLEVEL%>logfile
— Чтобы можно было выполнять другие сравнения с уровнем ошибки — например, чтобы проверять равенство:
IF %ERRORLEVEL% EQU 1 echo Different!
Но я отклонился от темы. На сегодня мой тезис такой: уровень ошибки — это не то же самое, что переменная %ERRORLEVEL%.
Источник: habr.com
Коды возврата, используемые программой Robocopy в Windows Server 2008 или Windows Server 2008 R2
В этой статье рассматриваются коды возврата, используемые программой Robocopy в Windows Server 2008 или Windows Server 2008 R2.
Применимо к: Windows Server 2008 R2 с пакетом обновления 1 (SP1), Windows 7 с пакетом обновления 1 (SP1), Windows Server 2012 R2
Исходный номер базы знаний: 954404
Введение
В следующей таблице перечислены коды возврата, используемые программой Robocopy.
Файлы не были скопированы. Сбой не был выполнен. Несоответствие файлов не было. Файлы уже существуют в целевом каталоге; поэтому операция копирования была пропущена. | |
1 | Все файлы были успешно скопированы. |
2 | В целевом каталоге есть несколько дополнительных файлов, которые отсутствуют в исходном каталоге. Файлы не были скопированы. |
3 | Некоторые файлы были скопированы. Присутствуют дополнительные файлы. Сбой не был выполнен. |
5 | Некоторые файлы были скопированы. Некоторые файлы не совпадают. Сбой не был выполнен. |
6 | Существуют дополнительные файлы и несовпадаемые файлы. Файлы не были скопированы, а сбои не были соблюдены. Это означает, что файлы уже существуют в целевом каталоге. |
7 | Файлы были скопированы, обнаружено несоответствие файлов и присутствуют дополнительные файлы. |
8 | Не удалось скопировать несколько файлов. |
Любое значение, большее или равное 8, указывает, что во время операции копирования был по крайней мере один сбой.
Дополнительные сведения
Для получения дополнительных сведений об использовании служебной программы Robocopy откройте командную строку, введите следующую команду и нажмите клавишу ВВОД:
Robocopy /?
Обратная связь
Были ли сведения на этой странице полезными?
Источник: learn.microsoft.com
Windows код возврата программы
Раньше я не знал, как правильно использовать в командных файлах (расширение .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
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!»
Источник: microsin.net