Bat файл если ошибка
Чтобы увидеть ошибки в синтаксисе, которые приводят к критическому завершению Batch-файла,
необходимо запустить его из CMD.exe (интерпретатора).
Как?
Этап 1. Подготовка:
Если у Вас в скрипте указана директива для скрытия вывода выполняемых команд:
иначе будет сложно определить, какая команда вызывает "падение" скрипта или ошибку.
Этап 2. Выполнение скрипта с перенаправлением вывода в файл протокола
Вариант 1. Для систем Windows XP и ниже:
ПУСК -> Выполнить (либо Win + R), вводим CMD, нажимаем
Откроется маленькое черное окно - консоль.
В нем Вы увидите путь к каталогу, в котором будут выполняться команды в данный момент.
Вам нужно перейти в каталог, где расположен бат-файл.
Например, Вам нужно запустить Batch-файл с именем script.cmd, расположенном в папке temp на диске C,
тогда вводим команды:
(ввод каждой строки подтверждаем клавишей )
Вариант а) С выводом в консоль:
Вариант б) С логированием во внешний файл
После ввода первой строки Вы увидите на экране приглашение вида:
c:\temp>
что свидетельствует об успешном переходе в каталог c:\temp
Вариант 2. Для систем Windows Vista и выше (переход в папку с батником сразу):
1. Перейдите на уровень выше от каталога, где находится Batch-файл
(иными словами: Вам нужно видеть пиктограмму значка папки, в которой находится Batch-файл)
Если Вы видите перед собой сам Batch-файл, достаточно нажать BackSpace (кнопка "стирания").
2. Наведите указатель мыши на папку с Batch-файлом.
Нажмите и удерживайте кнопку "Shift". Вместе с этим нажмите правую кнопку мыши.
3. Выберите пункт "Открыть окно команд".
Например, Вам нужно запустить Batch-файл с именем script.cmd, расположенном в папке temp на диске C,
тогда вводим команду:
Этап 3. Анализ файла-протокола.
После завершения работы Batch-файла в папке C:\temp будет создан файл log.txt
Передайте его специалистам, либо при наличии достаточного опыта проведите анализ самостоятельно.
Данный файл сохраняется в кодировке OEM-866, поэтому открывать его нужно в соответствующем редакторе: Русский текст в консоли - CMD/BAT - Киберфорум
Как правило, критические ошибки указаны в самом конце протокола и они предваряют команду, которая их вызвала.
Этап 4. (опционально)
Если бат-файл содержит цикл или является очень большим, полезным также будет подготовить лог уже с командой @echo off
Добавьте ее в самое начало кода и повторите всю процедуру.
Альтернатива вызову батника из-под интерпретатора.
В самом начале кода пишем:
и запускаем Batch-файл.
Все команды, выводимые на экран будут сразу перенаправляться в файл.
В этом случае на экране Вы не увидите ни выполняемых команд, ни вывода.
Все они будут протоколироваться в файл log.txt.
I have a batch file that's calling the same executable over and over with different parameters. How do I make it terminate immediately if one of the calls returns an error code of any level?
Basically, I want the equivalent of MSBuild's ContinueOnError=false .
Синтаксис
Если расширения команд включены, используйте следующий синтаксис:
Параметры
- Равно — равно
- Нек — не равно
- ЛСС — меньше
- LEQ -меньше или равно
- ГТР — больше
- Жек — больше или равно
Комментарии
Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else .
Когда программа останавливается, она возвращает код выхода. Чтобы использовать коды выхода в качестве условий, используйте параметр ERRORLEVEL .
При использовании определенногозначения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине%и % кмдекстверсион%.
% ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL.
% кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd.exe до любой обработки Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ.
% кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН.
Предложение else необходимо использовать в той же строке, что и команда после оператора If.
9 Answers 9
Check the errorlevel in an if statement, and then exit /b (exit the batch file only, not the entire cmd.exe process) for values other than 0.
If you want the value of the errorlevel to propagate outside of your batch file
but if this is inside a for it gets a bit tricky. You'll need something more like:
Delayed expansion enabled/disabled or command extensions (required for neq ) enabled/disabled does not matter on using if not errorlevel 1 exit /B as explained by Microsoft in support article Using command redirection operators and in help output on running if /? in a cmd window. The current errorlevel (exit code) is kept on exiting processing of batch file with exit /B . Note: exit with parameter /B requires enabled command extensions, see Where does GOTO :EOF return to?
Add || goto :label to each line, and then define a :label .
For example, create this .cmd file:
It's a very common idiom in most shell scripting languages, and it reads well: "Do this, or this if it fails.."
@MarcelValdezOrozco Seems to me that this is what || was created for in the first place. Maybe not goto in particular, but "try, do this on error" as Fowl mentioned. My question is does this work for all non-zero exit codes? Positives only?
@jpmc26 yes it does, prove it it to yourself - cmd /k exit -1 && echo success || echo fail - prints fail.
If you need, you can set the exit code:
And you can also log:
@FrankSchwieterman, yes, %ERRORLEVEL% is untouched when you call exit /b , so the error code is forwarded
Here is a polyglot program for BASH and Windows CMD that runs a series of commands and quits out if any of them fail:
I have used this type of thing in the past for a multiple platform continuous integration script.
One minor update, you should change the checks for "if errorlevel 1" to the following.
This is because on XP you can get negative numbers as errors. 0 = no problems, anything else is a problem.
And keep in mind the way that DOS handles the "IF ERRORLEVEL" tests. It will return true if the number you are checking for is that number or higher so if you are looking for specific error numbers you need to start with 255 and work down.
I prefer the OR form of command, as I find them the most readable (as opposed to having an if after each command). However, the naive way of doing this, command || exit /b %ERRORLEVEL% is wrong.
This is because batch expands variables when a line is first read, rather than when they are being used. This means that if the command in the line above fails, the batch file exits properly, but it exits with return code 0, because that is what the value of %ERRORLEVEL% was at the start of the line. Obviously, this is undesirable in our script, so we have to enable delayed expansion, like so:
This snippet will execute commands 1-4, and if any of them fails, it will exit with the same exit code as the failing command did.
Your code is correct, but I believe unnecessarily verbose for simple tasks: exit /b with no argument will preserve the errorlevel. Your example could be simplified to command-1 || exit /b -- shorter and no longer requires EnableDelayedExpansion. However, your code does demonstrate valid use of EnableDelayedExpansion, which someone might build upon, for example: command-1 || (echo Error=!errorlevel! && exit /b) .
We cannot always depend on ERRORLEVEL, because many times external programs or batch scripts do not return exit codes.
In that case we can use generic checks for failures like this:
And if the program outputs something to console, we can check it also.
No matter how I tried, the errorlevel always stays 0 even when msbuild failed. So I built my workaround:
Build Project and save log to Build.log
search for "0 Error" string in build log, set the result to var
get the last character, which indicates how many lines contains the search string
if string not found, then error > 0, build failed
That solution was inspired by Mechaflash's post at How to set commands output as a variable in a batch file
NOT - Указывает, что Windows должна выполнить эту команду, только если условие является ложным.
ERRORLEVEL число - Условие является истинным, если код возврата последней выполненной программы не меньше указанного числа.
строка1==строка2 - Условие является истинным, если указанные строки совпадают.
EXIST имя_файла - Условие является истинным, если файл с указанным именем существует.
команда - Задает команду, выполняемую при истинности условия. За этой командой может следовать ключевое слово ELSE. В случае, если указанное условие ложно, будет выполнена команда, находящаяся после слова ELSE.
Предложение ELSE должно располагаться в той же строке, что и команда, следующая за ключевым словом IF. Например:
IF EXIST имя_файла. (
del имя_файла.
) ELSE (
echo имя_файла. missing.
)
Следующий пример содержит ОШИБКУ, поскольку команда del должна заканчиваться переходом на новую строку:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. Missing
Следующий пример также содержит ОШИБКУ, поскольку команда ELSE должна располагаться в той же строке, что и команда, следующая за IF:
IF EXIST имя_файла. del имя_файла.
ELSE echo имя_файла. missing
Вот правильный пример, где все команды расположены в одной строке:
IF EXIST имя_файла. (del имя_файла.) ELSE echo имя_файла. Missing
Изменение команды IF при включении расширенной обработки команд:
IF [/I] строка1 оператор_сравнения строка2 команда
IF CMDEXTVERSION число команда
IF DEFINED переменная команда
где оператор_сравнения принимает следующие значения:
EQU - равно
NEQ - не равно
LSS - меньше
LEQ - меньше или равно
GTR - больше
GEQ - больше или равно,
а ключ /I , если он указан, задает сравнение текстовых строк без учета регистра. Ключ /I можно также использовать и в форме строка1==строка2 команды IF. Сравнения проводятся по общему типу данных, так что если строки 1 и 2 содержат только цифры, то обе строки преобразуются в числа, после чего выполняется сравнение чисел.
Условие CMDEXTVERSION применяется подобно условию ERRORLEVEL, но значение сравнивается с внутренним номером версии текущей реализации расширенной обработки команд. Первая версия имеет номер 1. Номер версии будет увеличиваться на единицу при каждом добавлении существенных возможностей расширенной обработки команд. Если расширенная обработка команд отключена, условие CMDEXTVERSION никогда не бывает истинно.
Условие DEFINED применяется подобно условию EXIST , но принимает в качестве аргумента имя переменной среды и возвращает истинное значение, если эта переменная определена.
Строка %ERRORLEVEL% будет развернута в строковое представление текущего значения кода ошибки ERRORLEVEL, за исключением ситуации, когда уже имеется переменная среды с именем ERRORLEVEL; в подобном случае подставляется значение этой переменной. Например, с помощью данной строки можно выполнить следующее:
goto answer%ERRORLEVEL%
:answer0
echo Получен код возврата 0
:answer1
echo Получен код возврата 1
Допускается и применение описанных выше операторов числового сравнения:
IF %ERRORLEVEL% LEQ 1 goto okay
Строка %CMDCMDLINE% будет развернута в исходную командную строку, переданную CMD.EXE до любой обработки, за исключением ситуации, когда уже определена переменная среды с именем CMDCMDLINE; в подобном случае подставляется значение этой переменной.
Строка %CMDEXTVERSION% будет развернута в строку, представляющую собой текущее значение CMDEXTVERSION, за исключением ситуации, когда уже имеется переменная среды с именем CMDEXTVERSION; в подобном случае подставляется значение этой переменной.
@echo off
REM Проверить наличие имени файла, задаваемого в качестве параметра %1
REM Если параметр %1 пустой – переход на метку error
if "%1" EQU "" goto error
REM Если параметр задан, создаем пустой файл, копированием из устройства nul
copy nul "%1"
exit
:error
ECHO File name required ! Must be - %~n0 filename.ext
:exit
Примеры вывода для отвечающего и не отвечающего узлов:
Ответ от 192.168.1.1: число байт=32 время=1мс TTL=64 - если устройство с данным IP-адресом доступно;
Превышен интервал ожидания для запроса. - если устройство не отвечает;
Команда find /I "TTL" возвращает код ERRORLEVEL равный 0 , если строка "TTL" присутствует в результате выполнения ping . Ключ /I имеет смысл использовать, чтобы результат не зависил от того, строчные или заглавные символы составляют строку "ttl".
Результат работы командного файла записывается в текстовый файл iplist.txt
@ECHO OFF
REM Постоянная часть IP-адреса
set IPTMP=192.168.1.
REM Количество пингуемых узлов
set N=254
rem С какого адреса начать - начальное значение " хвоста " IP- адреса X.X.X.IPMIN
set /A IPMIN=1
ECHO %DATE% Опрос пингом %N% адресов начиная с %IPTMP%%IPMIN% >> iplist.txt
rem M0 - метка для организации цикла
:M0
rem Переменная IPFULL - полное значение текущего IP-адреса
set IPFULL=%IPTMP%%IPMIN%
rem Если " хвост "больше N – перейти к завершению работы
IF %IPMIN% GTR %N% GOTO ENDJOB
ping -n 1 %IPFULL% | find /I "TTL"
if %ERRORLEVEL%==0 Echo %IPFULL% >> iplist.txt
rem Сформируем следующий IP-адрес
set /A IPMIN=%IPMIN% + 1
rem Перейдем на выполнение следующего шага
GOTO M0
rem Завершение работы
:endjob
exit
Существуют некоторые особенности реализации командного интерпретатора CMD.EXE , которые необходимо учитывать при обработке значений переменных внутри циклов IF и FOR . Использование значений переменных внутри скобок, требует изменения стандартного режима интерпретации командного процессора. Разработчиками предусмотрена возможность запуска CMD.EXE с параметром /V:ON , что включает разрешение отложенного расширения переменных среды с применением символа восклицательного знака ( ! ) в качестве разделителя. То есть, параметр /V:ON разрешает использовать !var! в качестве значения переменной var во время выполнения внутри циклов команд FOR и IF . Но на практике чаще используется возможность локального включения данного режима внутри командного файла специальной директивой:
После чего, можно обрабатывать принимаемые переменными значения внутри цикла, используя вместо знаков процента восклицательные знаки:
FOR … (
IF !ERRORLEVEL!==0 вместо %ERRORLEVEL%==0
…
)
    В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию - вместо оператора EQU - равно , указано EQL - равно
Команда EXIT используется для завершения пакетных файлов с установкой значения переменной ERRORLEVEL или для завершения командного процессора CMD.EXE ( для выхода из командной строки), если она выполняется вне пакетного файла.
Формат командной строки:
EXIT [/B] [exitCode]
Параметры командной строки:
/B - Предписывает завершить текущий пакетный файл-сценарий вместо завершения CMD.EXE. Если выполняется вне пакетного файла-сценария, то будет завершена программа CMD.EXE
exitCode - Указывает цифровое значение. Если указан ключ /B, определяет номер для ERRORLEVEL. В случае завершения работы CMD.EXE, устанавливает код завершения процесс с данным номером.
Примеры использования команды EXIT
exit - завершить текущий сеанс CMD
Команда EXIT с параметрами используются, как правило, только в командных файлах. Например, для индикации результата выполнения с установкой значения переменной среды ERRORLEVEL
REM перейти к метке, где выполняется выход с ERRORLEVEL=0
REM перейти к метке, где выполняется выход с ERRORLEVEL=1
REM установить ERRORLEVEL равный 0 и завершить работу
REM установить ERRORLEVEL равный 1 и завершить работу
Параметр /B используется в тех случаях, когда выполняется завершение командного файла, но необходимо продолжить работу командного процессора. Например, когда командный файл 1.bat вызывает командной CALL другой командный файл 2.bat , результат выполнения которого, характеризуется значением переменной окружения ERRORLEVEL . Если в вызываемом командном файле использовать команду EXIT без параметра /B, то будет завершена работа вызываемого файла 2.bat, а также вызывающего файла 1 .bat и интерпретатора CMD.EXE, т.е вместо выхода из вызываемого файла будет полностью завершен сеанс командной строки.
Простейший пример, когда командный файл 1.bat вызывает на выполнение другой командный файл с именем 2.bat и выводит на экран значение ERRORLEVEL, установленное при выходе из вызываемого файла:
echo Batch file 2.bat executed with ERRORLEVEL = %ERRORLEVEL%
Файл 2.bat завершается командой EXIT с установкой значения ERRORLEVEL, равного 128:
Batch file 2.bat executed with ERRORLEVEL = 128
Попробуйте убрать параметр /B в команде EXIT командного файла 2.bat и оцените полученный результат.
Выполняет условную обработку в пакетных программах.
Примеры
Эти строки можно объединить в одну строку следующим образом:
Чтобы вывести значение переменной среды ERRORLEVEL после выполнения пакетного файла, введите в пакетный файл следующие строки:
Чтобы вернуться к метке "хорошо", если значение переменной среды ERRORLEVEL меньше или равно 1, введите:
Читайте также:
- Редми 3 карта памяти какая
- System objectdisposedexception доступ к закрытому файлу невозможен
- S12 digma отключить подсветку
- При изменении имени компьютера произошла следующая ошибка учетная запись уже существует
- Этот файл сейчас используется укажите другое имя файла или закройте файл в другом приложении