Bat ошибки в файл

Обновлено: 06.07.2024

Часто , при выполнении сложного bat файла в автоматическом режиме проверить результаты его работы бывает затруднительно по многим причинам .

Поэтому проще записывать результаты работы команд batch файла в текстовый файл ( лог-файл ) . а потом анализировать правильность работы bat файла по этому логу .

Создайте bat -файл следующего содержания ( скопируйте эти строки в Блокнот и сохраните файл с расширением bat ) :

Таким образом , в лог-файл будут записаны только результаты их выполнения .

Вторая строка записывает в лог-файл время начала работы пакетного файла .

Третья строка записывает в лог-файл пояснение того , что следующая команда создаст файл test . txt

Команда из четвертой строки создает файл test . txt с корне диска С . Файл создается для примера .

Эта команда записывает в файл C : \ test . txt слово test

Пятая строка выводит в лог-файл пояснение , что следующая команда выполняет копирование файла из одного места в другое .

Команда в шестой строке копирует созданный файл C : \ test . txt в файл C : \ Old_test . txt , т . е . создается копия файла под новым именем .

Последняя , седьмая строка содержит команду вывода времени завершения работы пакетного файла .

В сумме с записью в лог-файл времени начала работы пакетного файла эти два значения времени дают возможность оценить время работы пакетного файла .

Сохраните этот пакетный файл под именем , например , 1.bat

Предположим , что отчет о работе пакетного файла мы бы хотели хранить в отдельной папке и каждый день записывать отчет с новым именем файла ,

чтобы была возможность в любой из дней обратиться к логам за предыдущие дни .

Причем , имя лог-фала хотелось бы иметь в виде даты работы пакетного файла .

Чтобы все это реализовать создадим на диске С ( например ) папку с именем LOG , т . е . полный путь к ней будет выглядеть C : \ LOG .

Созданный пакетный файл 1.bat будем запускать следующей командой :

Если пакетный файл будет запускаться из Планировщика , то нужно указать полный путь с bat -файлу .

Помните , что если в пути есть пробелы , то надо использовать либо кавычки , либо формат 8.3.

Т . е . , если путь к bat -файлу C : \ Program Files \ 1.bat , например , то в командной строке Планировщика для запуска bat -файла нужно указать одну из следующих строк :

1 \ 1.bat > C : \ LOG \ % date

После запуска файла 1.bat в папке C : \ LOG будет создан файл с именем , равным дате запуска bat -файла , например , 13.01.2004.txt Это и будет отчет о работе пакетного файла 1.bat.

Запуск bat -файла , пример которого показан в первом листинге вверху страницы , указанной выше командой , приведет к созданию лог-файла такого содержания :

Таким образом , для выполнения перенаправления результатов работы bat -файла в лог-файл нужно использовать символ перенаправления > Синтаксис таков :

Расширение лог-файла может быть любым . При желании , отчет о выполнении пакетного задания можно оформить даже в виде страницы html

( соответствующие теги могут быть выведены в лог-файл так , как выводились комментарии в примере 1.bat ) и скопировать его на корпоративный сервер .

У меня есть файл .bat, который запускает два файла SQL и перемещает файлы. Мне нужна обработка ошибок в этом .bat файле. Я хочу, чтобы он принял ошибку, сгенерированную в sql, и передал ее в AutoSys. Мне был предоставлен этот код:

Однако мне нужно, чтобы он запускался в файле .bat, а не в Linux?

В настоящее время у меня есть:

Полный .bat файл:

Эквивалент кода выхода $? в пакете - уровень ошибки, доступный через переменную %ERRORLEVEL% . В пакетном сценарии существует специальная форма предложения IF, которая использует уровень ошибки: IF ERRORLEVEL n эквивалентно: "если уровень ошибки больше или равно n'. Как и в bash, значение 0 означает, что предыдущая команда была выполнена без ошибок (не всегда, некоторые команды не устанавливают уровень ошибок). Итак, у вас есть два варианта:

  1. IF %ERRORLEVEL% NEQ 0 что является дословным переводом вашего оператора if в вашем сценарии bash. Имейте в виду, что вам придется использовать версию с отложенным расширением. IF !ERRORLEVEL! NEQ 0 внутри блоков кода, разделенных (. ) (отметьте этот вопрос, который объясняет, почему)
  2. IF ERRORLEVEL 1 что IMHO более подходит (хотя зависит от ваших предпочтений). Также работает внутри (. ) блоки кода, но предполагается, что команды никогда не устанавливают отрицательные уровни ошибок (никогда не встречались, но стоит упомянуть)

Обычно установка переменной с set команда не изменяет уровень ошибки, поэтому вы можете выбрать один из двух вариантов. Но так как у меня сейчас нет компьютера с Windows, чтобы протестировать его, я перестраховываюсь и предлагаю вам первый вариант. Я отредактирую свой ответ, как только протестирую второй вариант.

Последний совет: используйте exit /b вместо exit . exit также выйдет из командной строки в пакетном режиме

РЕДАКТИРОВАТЬ Я тестировал вторую версию, она тоже работает. Таким образом, приведенный выше код можно заменить на:

В этой статье блога довольно хорошо объясняется, почему следует использовать эту версию вместо первой с использованием переменной% ERRORLEVEL%.

Другой вариант, о котором мне любезно напомнил @aschipfl, - это использование операторов условного выполнения. && и || :

  • command1 && command2 выполнит command2 только если command1 удалось
  • command1 || command2 выполнит command2 только если command1 не удалось.

Оба оператора используют код выхода (в большинстве случаев такой же, как уровень ошибки, но не всегда), чтобы определить, завершилась ли команда неудачно или успешно.

Я также видел, что вы разместили свой пакетный файл. Однако есть кое-что, что я хотел бы отметить: goto @ERROR_HANDLING_SQL выдаст ошибку, потому что метки нет @ERROR_HANDLING_SQL . Есть ярлык ERROR_HANDLING_SQL в конце вашего скрипта. Если вы пытались перейти к этой метке, вы должны заменить все вхождения goto @ERROR_HANDLING_SQL с участием goto ERROR_HANDLING_SQL

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



Group Icon



Репутация: 524


какой командой заставить писать лог в файл всего что делается в том числе ошибок. вот так нехотить ошибки писать:

пишет что скопирован файл например, а если ошибка копирования то не пишет ничего. где то видел что то подобное типа:

тока синтаксис не могу вспомнить хоть убей.
подскажите а.. уже 3 справочника замучал.

я есть я и никто иной

Group Icon





Репутация: 648


какой командой заставить писать лог в файл всего что делается в том числе ошибок. вот так нехотить ошибки писать:

пишет что скопирован файл например, а если ошибка копирования то не пишет ничего. где то видел что то подобное типа:

тока синтаксис не могу вспомнить хоть убей.
подскажите а.. уже 3 справочника замучал.

а просто конструкция "имяфайла.bat >>file.log" не проходит?

Group Icon



Репутация: 524

а просто конструкция "имяфайла.bat >>file.log" не проходит?

я есть я и никто иной

Group Icon





Репутация: 648

в самом батнике тоже можно писать, логи разных этапов в разные файлы :-))
только вот не ото всех прог так можно получить файл лога

">" перезаписывает файл если он есть, если нет - создаёт новый
">>" добавляет к имеющемуся содержимому файла

Group Icon



Репутация: 524

то ли Вы невнимательны, то ли плохо я описал, но это я знаю, выше в примере я показывал такую инфу.. хотелось бы вида
spool logfile=backup.log
.
spool off

точно уверен, что так можно, ибо видел такой батник, но дай бог вспомнить как эта херня пишеться..





Репутация: 1423

то ли Вы невнимательны, то ли плохо я описал, но это я знаю, выше в примере я показывал такую инфу.. хотелось бы вида
spool logfile=backup.log
.
spool off

точно уверен, что так можно, ибо видел такой батник, но дай бог вспомнить как эта херня пишеться..

Ну как я понял создается переменная с именем файла лога, потом вывод перенаправляется туда. В чем, собственно проблема то?

Group Icon



Репутация: 524

Ну как я понял создается переменная с именем файла лога, потом вывод перенаправляется туда. В чем, собственно проблема то?
не соффсем понял, растолкуйте плиз, желатольно в виде команд

Group Icon

Репутация: 112

Маленько не в тему, надо уже наверно создать ветку про батники. Я пол инета обрыл а надо было всего 2 батника написать. Посоветуйте литературу по написанию батников, команды, примеры. Заранее спасибо .





Репутация: 1423


не соффсем понял, растолкуйте плиз, желатольно в виде команд

Вот тебе пара кусков кода:


Маленько не в тему, надо уже наверно создать ветку про батники. Я пол инета обрыл а надо было всего 2 батника написать. Посоветуйте литературу по написанию батников, команды, примеры. Заранее спасибо .

Тут погляди. Ссылок и прочего - море

век учись, а дураком умрешь

Group Icon

ну так ошибки пишутся в другой поток, почуствуй разницу (дискетки в a: естественно нету):
dir a: > err.txt
dir a: 2> err2.txt


где то видел что то подобное типа:
spool logfile=backup.log
тока синтаксис не могу вспомнить хоть убей.
подскажите а.. уже 3 справочника замучал.

ты наверное видел это в sql


Посоветуйте литературу по написанию батников, команды, примеры.

Group Icon



Репутация: 524

не не, это я пример из sql привел.. а в батнике я такое тоже видел.

shouhei грамотную тему тут привел, но это сильно сложно, проще сдалать как советовал jonsony, т.е. запускать название.bat >> log.txt, а сделать это из друго бат файла, какие мне нужно ошибки он пишет, сёдня затестил. единственное не пишет ошибки синтаксиса команд, если "cpy" вместо "copy" например написать, но это можно проверить 1 раз, например запустив батник в far manager и посмотреть лог fara там всё есть.


Посоветуйте литературу по написанию батников, команды, примеры. Заранее спасибо .

у меня есть пара справочников и одна книжка, но на работе, по возможности выложу в понедельник..

Group Icon

Репутация: 112


у меня есть пара справочников и одна книжка, но на работе, по возможности выложу в понедельник..

Group Icon



Репутация: 524

извиняюсь забыл, на работе зат***али

зы у меня лог нормально пишется через

запускаю через другой батник, правда не видно что в данный момент делается, но это не важно, лог важнее..

Вот скажите мне ещё одну фишку:

команде zip какой ключ надо ставить чтобы распаковывать архив? чёт нигде не нашел..





Репутация: 1423

Вот скажите мне ещё одну фишку:

команде zip какой ключ надо ставить чтобы распаковывать архив? чёт нигде не нашел..

Читайте также: