I’m currently writing my first batch file for deploying an asp.net solution.
I’ve been Googling a bit for a general error handling approach and can’t find anything really useful.
Basically if any thing goes wrong I want to stop and print out what went wrong.
Can anyone give me any pointers?
John Saunders
160k26 gold badges239 silver badges393 bronze badges
asked Jul 22, 2009 at 9:15
I generally find the conditional command concatenation operators much more convenient than ERRORLEVEL.
yourCommand && (
echo yourCommand was successful
) || (
echo yourCommand failed
)
There is one complication you should be aware of. The error branch will fire if the last command in the success branch raises an error.
yourCommand && (
someCommandThatMayFail
) || (
echo This will fire if yourCommand or someCommandThatMayFail raises an error
)
The fix is to insert a harmless command that is guaranteed to succeed at the end of the success branch. I like to use (call ), which does nothing except set the ERRORLEVEL to 0. There is a corollary (call) that does nothing except set the ERRORLEVEL to 1.
yourCommand && (
someCommandThatMayFail
(call )
) || (
echo This can only fire if yourCommand raises an error
)
See Foolproof way to check for nonzero (error) return code in windows batch file for examples of the intricacies needed when using ERRORLEVEL to detect errors.
answered Jun 13, 2013 at 11:27
![]()
dbenhamdbenham
126k28 gold badges244 silver badges383 bronze badges
7
Using ERRORLEVEL when it’s available is the easiest option. However, if you’re calling an external program to perform some task, and it doesn’t return proper codes, you can pipe the output to ‘find’ and check the errorlevel from that.
c:mypathmyexe.exe | find "ERROR" >nul2>nul
if not ERRORLEVEL 1 (
echo. Uh oh, something bad happened
exit /b 1
)
Or to give more info about what happened
c:mypathmyexe.exe 2&1> myexe.log
find "Invalid File" "myexe.log" >nul2>nul && echo.Invalid File error in Myexe.exe && exit /b 1
find "Error 0x12345678" "myexe.log" >nul2>nul && echo.Myexe.exe was unable to contact server x && exit /b 1
answered Aug 27, 2013 at 16:55
1
Other than ERRORLEVEL, batch files have no error handling. You’d want to look at a more powerful scripting language. I’ve been moving code to PowerShell.
The ability to easily use .Net assemblies and methods was one of the major reasons I started with PowerShell. The improved error handling was another. The fact that Microsoft is now requiring all of its server programs (Exchange, SQL Server etc) to be PowerShell drivable was pure icing on the cake.
Right now, it looks like any time invested in learning and using PowerShell will be time well spent.
answered Jul 22, 2009 at 10:52
Brad BruceBrad Bruce
7,5553 gold badges38 silver badges60 bronze badges
3
A successful ping on your local network can be trapped using ERRORLEVEL.
@ECHO OFF
PING 10.0.0.123
IF ERRORLEVEL 1 GOTO NOT-THERE
ECHO IP ADDRESS EXISTS
PAUSE
EXIT
:NOT-THERE
ECHO IP ADDRESS NOT NOT EXIST
PAUSE
EXIT
answered Jul 9, 2013 at 13:38
Rob DavisRob Davis
611 silver badge1 bronze badge
I guess this feature was added since the OP but for future reference errors that would output in the command window can be redirected to a file independent of the standard output
command 1> file — Write the standard output of command to file
command 2> file — Write the standard error of command to file
answered Feb 6, 2015 at 15:36
Python Unittest, Bat process Error Codes:
if __name__ == "__main__":
test_suite = unittest.TestSuite()
test_suite.addTest(RunTestCases("test_aggregationCount_001"))
runner = unittest.TextTestRunner()
result = runner.run(test_suite)
# result = unittest.TextTestRunner().run(test_suite)
if result.wasSuccessful():
print("############### Test Successful! ###############")
sys.exit(1)
else:
print("############### Test Failed! ###############")
sys.exit()
Bat codes:
@echo off
for /l %%a in (1,1,2) do (
testcase_test.py && (
echo Error found. Waiting here...
pause
) || (
echo This time of test is ok.
)
)
answered Sep 24, 2017 at 7:54
TonnyTonny
212 bronze badges
Its extremely easy!
Create a file that contains:
call <filename> // the file you made
cls
echo An error occured!
<Your commands>
pause
So now when you start it, it will launch your program as normal. But when anything goes wrong it exits and continues the script inside the first file. Now there you can put your own commands in.
answered Nov 17, 2016 at 19:51
![]()
BlazeLPBlazeLP
1351 silver badge8 bronze badges
0
|
Главная > CMD >
IF
|
| Оператор | Описание |
|---|---|
| EQU | равно |
| NEQ | не равно |
| LSS | меньше |
| LEQ | меньше или равно |
| GTR | больше |
| GEQ | больше или равно |
Заметки
- Если условие, заданное в команде if, выполняется, будет выполнена команда, следующая за условием. Если условие не выполняется, команда, заданная в операторе if, пропускается, а управление переходит к команде оператора else, если она задана.
- Когда программа завершается, она возвращает код завершения. С помощью параметра errorlevel коды завершения можно использовать в качестве условий.
- Использование команды defined переменная
При использовании команды defined переменная добавляются следующие три переменные: %errorlevel%, %cmdcmdline% и %cmdextversion%.
%errorlevel% замещается строковым представлением текущего значенияerrorlevel, если только уже не существует переменная среды с именем ERRORLEVEL. В этом случае будет использовано ее значение. В следующем примере показано использование значения errorlevel после выполнения пакетной программы:
goto answer%errorlevel%
:answer0
echo Код возврата программы равен 0
:answer1
echo Код возврата программы равен 1
goto end
:end
echo Готово!Операторы сравнения оп_сравнения также можно использовать следующим образом:
if %errorlevel% LEQ 1 goto okay%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.
%cmdextversion% замещается строковым представлением текущего значенияcmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.
- Использование оператора else
Оператор else должен размещаться в той же строке, что и команда if. Пример:
IF EXIST имя_файла. ( del имя_файла. ) ELSE ( echo имя_файла. отсутствует. )Приведенный ниже пример не будет работать, поскольку команда del должна заканчиваться новой строкой:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует
Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:
IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствуетЕсли необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:
IF EXIST имя_файла (del имя_файла) ELSE echo имя_файла отсутствует
Примеры
Если файл Product.dat не удается найти, появится следующее сообщение:
if not exist product.dat echo Не найден файл данных
Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:
:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo Ошибка при форматировании.
:end
echo Конец пакетной программы.
Если ошибка не возникнет, сообщение об ошибке выведено не будет.
Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:
if exist c:mydirnul goto process
Comments
-
Главная
-
AD
-
Как корректно удалить профиль
-
Отображение дерева в AD
-
Дерево Active Directory в Windows Form
-
Отображение Дерева AD на web странице
-
-
Получение списка пользователей
-
Проект Адресная книга
-
Данные из АД в виде Справочника
-
WEB часть адресной книги
-
Набор вспомогательных классов
-
Класс работы с XML таблицами
-
Класс работы с конфигурацией
-
Класс чтение Active Directory
-
-
Создать Windows Service
-
-
-
Прячим пароли в поток файла
-
Чиним вкладку History в Internet Explorer
-
Чтение Active Directory с помощью C#
-
Универсальный метод чтения данных из AD
-
-
-
android
-
1) Создаем проект в AndroidStudio
-
2) Описание проекта в AndroidStudio
-
3) Добавляем OpenGL в проект
-
OpenGL
-
Рисуем на экране OpenGL
-
-
Методы окна (активности) Android
-
Проект игры ХО
-
-
C#
-
OpenTK
-
01) Установка OpenTK
-
02) Математические функции OpenTK
-
03) Графические функции OpenTK
-
04) Материалы (текустуры) OpenTK
-
05) Буфер кадра
-
06) Геометрические фигуры OpenTK
-
07) Буфер вершин в OpenTK
-
08) Смещение массивов в OpenTK
-
09) Массивы вершин в OpenTK
-
10) Рисование в OpenTK
-
11) Звук в OpenTK
-
12) Обработка ввода OpenTK
-
12) Расширенные возможности OpenTK
-
-
SharpDX
-
Библиотека классов
-
SharpDX пространство имен
-
AngleSingle структура (SharpDX)
-
-
-
-
SharpGL
-
DrawText
-
-
Асоциации файлов с приложениями
-
Из целых чисел в двоичный код
-
Команды Ping и DNS на языке C#
-
Пишем свой клиент — сервер
-
1) Запускаем прослушку порта
-
-
Работа с DSN именами в ODBC
-
1) Создание DSN источника в ODBC
-
-
Размешаем иконку в панели уведомлений
-
Рекурсивный поиск файлов и папок
-
Сеть
-
Общий пинг сети
-
-
Файл настроек на основе XML
-
Файл настроек в виде XML
-
-
CMD
-
Append
-
Arp
-
Assoc
-
At
-
Atmadm
-
Attrib
-
Bootcfg
-
Cacls
-
Call
-
CHANGE
-
Chcp
-
Chdir (Cd)
-
Chkdsk
-
Chkntfs
-
Choice
-
Cipher
-
Cls
-
Cmd
-
Cmdkey
-
Cmstp
-
Color
-
Comp
-
Compact
-
Convert
-
Copy
-
Cprofile
-
CScript
-
Date
-
Debug
-
allocate expanded memory
-
assemble
-
compare
-
deallocate expanded memory
-
display expanded memory status
-
dump
-
enter
-
fill
-
go
-
hexadecimal
-
input
-
load
-
move
-
name
-
output
-
proceed
-
quit
-
register
-
trace
-
unassemble
-
write
-
мар expanded memory pages
-
-
Defrag
-
Del
-
Dir
-
Diskcomp
-
Diskcopy
-
DiskPart
-
Doskey
-
Driverquery
-
Echo
-
Edit
-
Endlocal
-
Eventcreate
-
Eventquery
-
Eventtriggers
-
Evntcmd
-
Exe2bin
-
Exit
-
Expand
-
Fc
-
Find
-
Findstr
-
Finger
-
Flattemp
-
For
-
Forcedos
-
FORFILES
-
Format
-
Freedisk
-
Fsutil
-
behavior
-
dirty
-
file
-
fsinfo
-
hardlink
-
objectid
-
quota
-
reparsepoint
-
sparse
-
usn
-
volume
-
-
Ftp
-
Подкоманды команды Ftp
-
append
-
ascii
-
bell
-
binary
-
bye
-
cd
-
close
-
debug
-
delete
-
dir
-
disconnect
-
Ftp: !
-
get
-
glob
-
hash
-
help
-
lcd
-
literal
-
ls
-
mdelete
-
mdir
-
mget
-
mkdir
-
mls
-
mput
-
open
-
prompt
-
put
-
pwd
-
quit
-
quote
-
recv
-
remotehelp
-
rename
-
rmdir
-
send
-
status
-
trace
-
type
-
user
-
verbose
-
-
-
Ftype
-
Getmac
-
Goto
-
Gpresult
-
Gpupdate
-
Graftabl
-
Helpctr
-
Hostname
-
IF
-
Ipconfig
-
Ipseccmd
-
Ipxroute
-
Irftp
-
Label
-
Loadfix
-
Lodctr
-
Logman
-
Lpq
-
Lpr
-
Macfile
-
Mkdir
-
Mmc
-
-
Mode
-
More
-
Mountvol
-
Move
-
Msg
-
Msiexec
-
Msinfo32
-
Mstsc
-
Nbtstat
-
Net
-
accounts
-
computer
-
config
-
continue
-
file
-
group
-
help
-
helpmsg
-
localgroup
-
name
-
pause
-
print
-
send
-
session
-
share
-
start
-
statistics
-
stop
-
time
-
use
-
user
-
view
-
-
Netstat
-
Nslookup
-
Ntbackup
-
Ntcmdprompt
-
Openfiles
-
Pagefileconfig
-
path
-
Pathping
-
Pause
-
Pbadmin
-
Pentnt
-
Perfmon
-
Ping
-
Popd
-
Print
-
Prncnfg
-
Prndrvr
-
Prnjobs
-
Prnmngr
-
Prnqctl
-
Prompt
-
Pushd
-
Rasdial
-
Recover
-
Reg
-
Regsvr32
-
Relog
-
Rem
-
Rename
-
Replace
-
Reset session
-
Rmdir
-
ROBOCOPY
-
Route
-
Rsm
-
Runas
-
Rundll32
-
SC
-
Schtasks
-
Secedit
-
Set
-
Setlocal
-
SetX
-
sfc
-
Shadow
-
Shift
-
Shutdown
-
Sort
-
Start
-
Subst
-
Systeminfo
-
Taskkill
-
Tasklist
-
Tcmsetup
-
Telnet
-
Tftp
-
Time
-
TIMEOUT
-
Title
-
-
Tracerpt
-
Tree
-
Tscon
-
Tskill
-
Tsprof
-
Tsshutdn
-
Type
-
Typeperf
-
Unlodctr
-
Ver
-
Vol
-
Vssadmin
-
W32tm
-
WMIC
-
Вызов WMIC
-
Синтаксис команды WMIC
-
Терминология
-
-
Xcopy
-
Команды запросов служб терминалов
-
process
-
session
-
termserver
-
user
-
-
Справка
-
-
Exchange
-
freebsd
-
FreeBSD. Локаль
-
Ubuntu RDP из Windows
-
Добавление новых пользователей в MySQL
-
Создание и использование базы данных
-
-
Руссификация FreeBSD
-
Снятие блока пользователя в Dropal
-
установка web сервера
-
Установка и настройка phpMyAdmin
-
-
OpenGL
-
C#
-
Первый проект OpenGL
-
Рисуем точки с помощью OpenGL
-
Упражнение звездное небо
-
-
Точка основа графики
-
-
OpenGL загрузка ресурсов
-
OpenGL загрузка формата Obj
-
-
Загрузка текстуры
-
Загрузка формата obj
-
Окно OpenGL
-
Рисование примитивов в OpenGL
-
С++
-
Наденные уроки
-
01. Инициализация OpenGL
-
02. Отображение полигонов
-
03. Отображение цветов
-
04. Вращение полигонов
-
05. Создание фигур в 3D
-
06. Наложение текстуры
-
07. Фильтрация текстур
-
08. Смешивание
-
09. Передвижение изображений
-
10. Загрузка и перемещение в 3D
-
11. Эффект «флага» на OpenGL
-
12. Использование списков
-
13. Растровые шрифты
-
14. Векторные шрифты
-
15. Текстурные шрифты
-
16 Эффект тумана
-
17 Двухмерные шрифты
-
18. Квадратирование
-
19. Машина моделирования частиц
-
20. Маскирование
-
21. Линии, сглаживание
-
22. Наложение микрорельефа
-
23. Квадратирование со сферическим наложением
-
24. Вырезка и Загрузка TGA
-
25. Морфинг и загрузка объектов
-
26. Реалистичное отражение
-
27. Тени d OpenGL
-
28. Фрагменты поверхностей Безье
-
29. Блиттер-функция
-
30. Определение столкновений в OpenGL
-
31. Визуализация моделей
-
32. Выбор, альфа смешивание
-
34. Построение красивых ландшафтов
-
35. Проигрывание AVI файлов в OpenGL.
-
36. Радиальное размытие
-
37. Мультипликационное закрашивание
-
39. Введение в физический симулятор
-
40. Моделирование движений веревки
-
41. Объемный туман и загрузка изображений
-
43. FreeType шрифты в OpenGL
-
46. Полноэкранное сглаживание
-
48. Вращение объектов
-
50 Улучшенная обработка ввода с использованием DirectInput
-
51 Отсечение по пирамиде видимости в OpenGL
-
-
Описание PIXELFORMATDESCRIPTOR
-
Первый проект c OpenGL
-
Пример в Embarcadero Rad Studio
-
Пример в Microsoft Visual Studio
-
-
-
Функции OpenGL библиоеки GL
-
glAccum
-
glAlphaFunc
-
glAreTexturesResident
-
glArrayElement
-
glBegin
-
glBegin() glEnd()
-
glBindTexture
-
glBitmap
-
glBlendFunc
-
glCallList
-
glCallLists
-
glClear
-
glClearAccum
-
glClearColor
-
glClearDepth
-
glClearIndex
-
glClearStencil
-
glClipPlane
-
glColor
-
glPointSize
-
glVertexPointer
-
-
-
PowerShell
-
about_aliases
-
about_Arithmetic_Operators
-
about_Arrays
-
about_assignment_operators
-
about_Automatic_Variables
-
about_Break
-
about_Command_Precedence
-
about_Command_Syntax
-
about_Comment_Based_Help
-
about_CommonParameters
-
about_Comparison_Operators
-
about_Continue
-
about_Core_Commands
-
about_Data_Sections
-
about_Debuggers
-
about_Do
-
about_Environment_Variables
-
about_Escape_Characters
-
about_EventLogs
-
about_Execution_Policies
-
about_For
-
about_Foreach
-
about_Format.ps1xml
-
about_Functions
-
about_Functions_Advanced
-
about_Functions_Advanced_Methods
-
about_Functions_Advanced_Parameters
-
about_Functions_CmdletBindingAttribute
-
about_Hash_Tables
-
about_History
-
about_If
-
about_Job_Details
-
about_Jobs
-
about_join
-
about_Language_Keywords
-
about_Line_Editing
-
about_Locations
-
about_Logical_Operators
-
about_methods
-
about_Modules
-
about_Objects
-
about_Operators
-
about_Parameters
-
about_parsing
-
about_Path_Syntax
-
about_pipelines
-
about_preference_variables
-
about_Profiles
-
about_Prompts
-
about_Properties
-
about_Providers
-
about_PSSession_Details
-
about_PSSessions
-
about_PSSnapins
-
about_Quoting_Rules
-
about_Redirection
-
about_Ref
-
about_Regular_Expressions
-
about_Remote
-
about_Remote_FAQ
-
about_Remote_Jobs
-
about_Remote_Output
-
about_Remote_Requirements
-
about_Remote_Troubleshooting
-
about_Requires
-
about_Reserved_Words
-
about_Return
-
about_Scopes
-
about_Script_Blocks
-
about_Script_Internationalization
-
about_Scripts
-
about_Session_Configurations
-
about_signing
-
about_Special_Characters
-
about_Split
-
about_Switch
-
about_Throw
-
about_Transactions
-
about_Trap
-
about_Try_Catch_Finally
-
about_Type_Operators
-
about_Types.ps1xml
-
about_Variables
-
about_While
-
about_Wildcards
-
about_Windows_PowerShell_ISE
-
about_WMI_cmdlets
-
about_WS-Management_Cmdlets
-
Get-Help
-
out_Windows_PowerShell_2.0
-
-
SQL скрипты
-
MS SQL поиск слова по всем таблицам
-
-
Базы данных
-
Microsoft SQL Server
-
СУБД
-
Язык SQL
-
Оператор SELECT
-
Оператор условия WHERE
-
-
-
Установка SQL сервера
-
-
Проекты по БД
-
Проект магазина
-
01) Описание типов данных
-
02) Создание таблиц
-
a) Microsoft Access 2007/2010
-
b) SQL Server 2008 ( интерфейс )
-
-
03) Связь и зависимость данных
-
a) Microsoft Access 2007/2010
-
b) SQL Server 2008 ( интерфейс )
-
-
04) Добавление данных
-
a) Microsoft Access 2007/2010
-
b) SQL Server 2008
-
-
-
-
Простое заполнение DataGridView из массива
-
Теория по базам данных
-
Варианты хранения данных
-
База данных
-
Основные модели баз данных
-
Файл
-
1) Сохранение и загрузка в XML
-
2) Добавление записей в XML
-
-
-
Добавление заказа
-
История хранилищ данных
-
Классификация БД по среде хранения
-
Классификация БД по степени распределённости
-
Преимущества баз данных
-
Система управления базами банных
-
Схема модулей СУБД
-
Функции СУБД
-
-
-
Информационная безопастность
-
Стеганография
-
-
Как делать простые опросы по E-Mail.
-
Найденные фичи
-
Про наложение текстур
-
Проблемы с офисом
-
-
Основы программирования
-
01) Введение
-
02) Принципы построения ЭВМ
-
03) Поколения языков
-
04) Компиляторы
-
05) Интерпретаторы
-
06) Правила программирования
-
07) Работа с данными
-
08) Операторы языка С++
-
8.1) Операторы условия
-
8.2) Операторы циклов
-
8.3) Операторы перехода
-
8.4) Создание калькулятора
-
-
09) Создание заголовочных файлов
-
10) Определение размера Массива
-
11) Русифицируем консоль
-
12) Интерактивный интерфейс
-
13) Получения кода клавиш
-
13) Работа с файловой системой
-
13.1) Запись/чтение файла
-
-
14) Четное / нечетное число
-
15) Нахождение Max/Min
-
Visual Studio Удаленная отладка сервисов
-
ВОПРОСЫ ДЛЯ ЗАЧЕТА
-
Загрузка картинки в VCL From
-
Знакомство с средой разработки
-
Основы синтаксиса языка C++
-
Создать переносимый проект Emdarcadero
-
Структурные типы данных
-
-
Отключение гибернации в Windows 7 8 10
-
Проекты
-
Arcanoid
-
PacMan
-
Вращение персонажа
-
Плавное перемещение персонажа
-
-
Разметка игрового поля
-
Редактор карт
-
Функция загрузки карты
-
Функция сохранения карты
-
-
Рисуем бонус
-
Рисуем Главного героя
-
Рисуем дверь на выход
-
-
Рисуем одну часть стенки
-
Рисуем приведение
-
Рисуем точку
-
Функция движения духов
-
-
Змейка
-
Движение змейки по полю
-
Пересечение змеи и зайцев
-
Расставляем зайцев
-
Создаем заготовку проекта
-
Функция движения змейки
-
Функция добавления части тела змейки
-
Реакция на клавиатуру
-
-
-
Морской бой
-
Игровой процесс
-
Выбор уровня при старте
-
Уровни сложности
-
Легкий режим игры
-
Меню выбора сложности
-
Средний и тяжелый уровень
-
-
-
Контроль правил оппонента
-
Поле игрока
-
Поле игры
-
Генератор для оппонента
-
Подсчет очков игры
-
-
Расстановка кораблей игрока
-
Генератор карты
-
Контроль правил
-
Ручная установка краблей
-
Установка кораблей
-
Функции редактора карты
-
-
Расстановка кораблей ПК
-
Генератор карты ПК
-
Контроль правил версия 2
-
Установка кораблей в поле ПК
-
-
Режимы игры
-
Функция отображения меню
-
Главное меню игры
-
-
-
Фугасный снаряд
-
-
план моей игры
-
Проект Bloks
-
Проект XO
-
Сетевой клиент сервер
-
Отправка сообщения клиенту
-
Получения сообщения от клиента
-
Серверная часть
-
-
Создание сетевого чата (Delphi)
-
-
Работа со ссылками
-
C# получение ссылок со страницы сайта
-
C# получение ссылок со страницы сайта 2
-
Размещение библиотек в GAC
-
С# скачивание фалов с сайтов
-
-
Теория Алгоритмов
-
1) Введение
-
2) Этапы решения задач
-
3) Языки описания алгориомов
-
4) Виды алгоритмов
-
4) Практика
-
1) Линейный алгоритм
-
2) Применение циклов
-
-
4.1) Алгоритм ветвления 1
-
4.2) Алгоритм ветвления 2
-
-
4) Перестановка значений
-
5) Перебор элементов массива
-
6) Методы сортировки
-
6.1) Пузырьковая сортировка
-
6.2) Сортировка вставками
-
6.2.1) Реализация метода
-
-
6.3) Сортировка выборками
-
-
Быстрая сортировка
-
ВОПРОСЫ ДЛЯ ЭКЗАМЕНА
-
Сортировка кучей
-
Сортировка слиянием
-
-
-
Обратная связь
ПоделитьсяНашли опечатку?Пожалуйста, сообщите об этом — просто выделите ошибочное слово или фразу и нажмите Shift Enter.
|
Добавить комментарий |
Every scripting and programming language contains an error handler like Java contains try-catch for error handling. In a Batch script, there is no direct way to do this, but we can create an error handler in the Batch script using a built-in variable of the Batch script name %ERRORLEVEL%.
This article will show how we can create a Batch script to handle errors and failures. Also, we are going to some examples that make the topic easier.
Error Handling in Batch Script
When a command successfully executes, it always returns an EXIT CODE that indicates whether the command successfully executed or failed to execute. So, to create an error handling in a Batch file, we can use that EXIT CODE in our program.
You can follow below general format to create an error handler:
@Echo off
SomeCommand && (
ECHO Message for Success
) || (
ECHO Message for Failure or Error
)
We can also do that by checking the variable named %ERRORLEVEL%. If the variable contains a value not equal to 0, then there might be a problem or error when executing the command. To test the %ERRORLEVEL% variable, you can follow the below example codes:
@ECHO off
Some Command Here !!!
IF %ERRORLEVEL% NEQ 0 (Echo Error found when running the command &Exit /b 1)
You must note that the keyword NEQ means Not Equal. And the variable %ERRORLEVEL% will only contain a non-zero value if there is a problem or error in the code.
An Example That Contains Errors
Below, we shared an example. We will run a Batch file named Your_file.bat from a location.
We intentionally removed that file from the directory. So it’s an error command.
The code for our example will be:
@echo off
ECHO Running a Batch file
CD G:BATCH
CALL Your_file.bat
IF errorlevel 1 GOTO ERROR
ECHO The file run successfully.
GOTO EOF
:ERROR
ECHO The file didn't run successfully.
CMD /k
EXIT /b 1
:EOF
Now, as the file doesn’t exist in the directory, it will show an error, and you will get the below output when you run the code shared above.
Output:
Running a Batch file
The system cannot find the path specified.
'Your_file.bat' is not recognized as an internal or external command,
operable program or batch file.
The file didn't run successfully.
An Error-Free Code Example That Runs Successfully
In the example above, we made a mistake on the code intentionally to understand how the code works. If we correct it like below:
@echo off
ECHO Running a Batch file
CALL "G:BATCHYourfile.bat"
IF errorlevel 1 GOTO ERROR
ECHO The file runs successfully.
GOTO EOF
:ERROR
ECHO The file didn't run successfully.
CMD /k
EXIT /b 1
:EOF
Then we will get an output like this:
Running a Batch file
This is from the first file
The file runs successfully.
Remember, all commands we discussed here are only for the Windows Command Prompt or CMD environment.
Входные параметры для командного файла
Существует
возможность передать командному файлу
параметры командной строки и использовать
их значения в операторах самого командного
файла.
BAT-файл
< параметр1 > , < параметр2 >, … <
параметрN >
В
самом командном файле первый параметр
будет доступен как переменная %1,
второй — %2
и
т.п. Имя самого командного файла доступно
как переменная %0.
Для примера создадим командный файл,
задачей которого будет выдача на экран
значений введенных параметров. Обычно
для вывода текста используется команда
ECHO
< текст >
Однако
если текст заменить на %1, — то будет выдан
первый параметр, на %2 — второй и т.д.
Создаем
файл parm.bat следующего содержания:
echo
Первый параметр=%1
echo
Второй параметр=%2
echo
Третий параметр = %3
и
запускаем его на выполнение следующей
командой:
parm.bat
FIRST second “two words”
после
его выполнения вы поймете, как это
работает и что параметры с пробелами,
нужно заключать в двойные кавычки. Для
того, чтобы обрабатываемые командным
процессором строки не выдавались на
экран, можно воспользоваться командой
ECHO
OFF,
поместив ее в первую строку командного
файла. Для того, чтобы строка командного
файла игнорировалась командным
процессором поместите в ее начало REM<
пробел > .
Таким образом можно помещать комментарии,
зачастую нелишние в больших командных
файлах:
rem
ECHO OFF выключает режим вывода содержания
строк командного файла на экран
REM
будет выводиться только результат их
выполнения.
ECHO
OFF
echo
Первый параметр=%1
echo
Второй параметр=%2
echo
Третий параметр = %3
Попробуйте
ECHO OFF заменить на @ECHO OFF – результат
говорит сам за себя. Строка, которая
выключает режим вывода, перестала
выдаваться на экран.
Переходы и метки
В
командных файлах можно использовать
команды условного перехода, меняющие
логику их работы в зависимости от
выполнения определенных условий. Для
иллюстрации приемов использования
условных переходов создадим командный
файл, целью которого будет присвоение
заранее определенной буквы диска для
съемных носителей, в качестве которых
будут использоваться флэш-диски. Условия
таковы – есть 2 флэш-диска, один из
которых должен быть виден в проводнике
как диск X: а второй – как диск Y: независимо
от того, в какой порт USB они подключены.
Будем считать, что реальные диски могут
быть подключены как F: или G: Опознавание
дисков будем выполнять по наличию файла
с определенным именем (лучше такой файл
сделать скрытым в корневом каталоге и
назвать его как-нибудь необычно):
Flashd1.let
– на первом диске
Flashd2.let
– на втором
Т.е.
задача командного файла заключается в
том, чтобы проверить наличие на сменных
дисках F:
и G:
файлов Flashd1.let
или Flashd2.let
и, в зависимости от того, какой из них
присутствует, присвоить диску букву X:
или Y:
Для
поиска файла на диске используем команду
IF
EXIST:
If exist имя_файла команда
В
качестве команды проще всего воспользоваться
SUBST,
сопоставляющей имя диска и каталог.
SUBST
X: C: — оздает
виртуальный диск X:, содержимым которого
будет корневой каталог диска C:
Создаем
командный файл setXY.bat со следующими
строками:
@ECHO
OFF
IF
EXIST G:flashd1.let SUBST X: G:
IF
EXIST F:flashd1.let SUBST X: F:
IF
EXIST G:flashd2.let SUBST Y: G:
IF
EXIST F:flashd2.let SUBST Y: F:
После
выполнения такого файла у вас появятся
диски X: и Y: Но если такой файл выполнить
повторно, команда SUBST выдаст сообщение
об ошибке – ведь диски X: и Y: уже существуют.
Желательно
обойти выполнение SUBST, если виртуальные
диски X: и Y: уже созданы, (или удалять их,
используя SUBST с параметром –d перед
подключением ). Модифицируем командный
файл с использованием GOTO
— передачи управления строке пакетного
файла по метке.
GOTO
метка
Метка
должна находиться в отдельной строке
и начинаться с двоеточия. Сделаем
изменения в нашем командном файле, чтобы
не возникало сообщений об ошибке:
@ECHO
OFF
REM
если не существует X: — то перейдем на
метку SETX
IF
NOT EXIST X: GOTO SETX
REM
если существует X: — перейдем на проверку
наличия Y:
GOTO
TESTY
:SETX
IF
EXIST G:flashd1.let SUBST X: G:
IF
EXIST F:flashd1.let SUBST X: F:
:TESTY
REM
если Y: существует – завершим командный
файл.
IF
EXIST Y: GOTO EXIT
IF
EXIST G:flashd2.let SUBST Y: G:
IF
EXIST F:flashd2.let SUBST Y: F:
REM
выход из командного файла
:EXIT
Сообщение
об ошибке SUBST исчезло. Признаки ошибок
при выполнении команд можно отслеживать
и в самом командном файле, анализируя
переменную ERRORLEVEL,
значение которой формируется при
выполнении большинства программ.
ERRORLEVEL равно 0, если программа завершилась
без ошибок и 1 – при возникновении
ошибки. Могут быть и другие значения,
если они предусмотрены в выполняемой
программе.
В
качестве команды в строке командного
файла можно использовать также командный
файл. Причем, для передачи с возвратом
обратно к точке выполнения вызывающего
командного файла используется команда
CALL
. Создадим командный файл test.bat, следующего
содержания:
@ECHO
OFF
ECHO
Вызов 1.bat
CALL
1.bat
ECHO
Возврат.
И
файл 1.bat, содержащий команду PAUSE,
приостанавливающую
выполнение командного файла до нажатия
любой клавиши.
@ECHO
OFF
pause
При
выполнении test.bat будет выдано на экран
сообщение
Вызов
1.bat
и
управление получит 1.bat с командой pause.
После начатия клавиши на клавиатуре
управление получит командная строка
“ECHO Возврат.” и на экран будет выдано
Возврат.
Если
же в test.bat убрать CALL , то возврат из файла
1.bat выполняться не будет. Кстати, используя
передачу управления командному файлу,
можно организовать его зацикливание.
Попробуйте добавить в конец файла
test.bat строку:
CALL
test.bat
Выйти
из зацикливания командного файла можно
по нажатию комбинации CTRL-Break. Возможно
использование команды CALL для вызова
процедуры внутри командного файла. В
этом случае в качестве аргумента
используется не имя внешнего файла, а
метка:
….
call :proc1
….
:proc1
….
exit
….
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
![]()
-
#1
А если исходя из переменной мне нужно выполнить определенный call?
Тогда просто используем set ==результат,и запуск команды верно?
А можно пример кода с комментарием?
А вот такой блок будет работать:
(прошу не обращать внимание на ошибки -это пример)
if %test%=result (
тут блок команд
(тут скрипт vbs)
) else echo error...
Последнее редактирование: 18 Окт 2013
![]()
-
#2
Koza Nozdri, видел твои коды.
Очень красивы, но Имхо, бессмысленны с точки зрения отладки ошибок и понимания логики переходов по условиям.
Очень рекомендую множество вложенных условий формировать по уровням,
как это делается на ЯВУ (языках высокого уровня).
Иначе, большая вероятность, потерять скобку.
if "%test%"=="result" (
тут блок команд
if "%A%"=="%B%" (
тут скрипт vbs
) else (
echo error...
)
) else (
echo test не равнялся result
)
Т.е. простейший IF для строк (с игнорированием регистра букв — ключ /i ) будет:
if /i "%A%"=="%B%" (
echo Удача
) else (
echo Неудача
)
Для оператора возврата кода ошибки:
:: генерируем произвольный код ошибки
cmd /c Exit /B 1
if errorlevel 1 (
echo Была ошибка
) else
echo Не было ошибок
)
Оператор errorlevel 1 — означает что мы сравниваем %errorlevel% с 1. Если код ошибки >= 1, то условие выполняется (true).Для логического сравнения чисел кавычки убираем:
@echo off
set X=1
set Y=2
if %Y% GTR %X% (
echo Y больше X
) else (
echo Y меньше, либо равен X
)
Справка if /?
EQL — равно (или просто знак == )
NEQ — не равно
LSS — меньше
LEQ — меньше или равно
GTR — больше
GEQ — больше или равно,Не забывай, что:
= это знак присвоения. Работает только с Set.
== это знак сравнения. Работает в операторе IF.Посмотри в коде Рекурсивный Dir /X (под спойлером) на сколько хорошо прослеживается логика вложенных условий.
Последнее редактирование: 18 Окт 2013