Меню

Bat если ошибка то

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's user avatar

John Saunders

160k26 gold badges239 silver badges393 bronze badges

asked Jul 22, 2009 at 9:15

handles's user avatar

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.

Community's user avatar

answered Jun 13, 2013 at 11:27

dbenham's user avatar

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

M Jeremy Carter's user avatar

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 Bruce's user avatar

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

michaelb958--GoFundMonica's user avatar

answered Jul 9, 2013 at 13:38

Rob Davis's user avatar

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

TakenItEasy's user avatar

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

Tonny's user avatar

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

BlazeLP's user avatar

BlazeLPBlazeLP

1351 silver badge8 bronze badges

0

Главная‎ > ‎CMD‎ > ‎

IF

Обработка условий в пакетных программах.

Синтаксис

if [noterrorlevel число команда [ else выражение]

if [notстрока1==строка2 команда [ else выражение]

if [notexist имя_файла команда [ else выражение]

Если расширения командного процессора разрешены, следует использовать следующий синтаксис:

if [/iстрока1 оп_сравнения строка2  команда [else выражение]

if cmdextversion число команда [else  выражение]

if defined переменная команда [else  выражение]

Параметры

not
Задает выполнение команды только в случае невыполнения условия.
errorlevel число
Условие выполняется, если предыдущая команда, обработанная интерпретатором команд Cmd.exe, завершилась с кодом, равным или большим числа.
команда
Команда, которая должна быть обработана в случае выполнения условия.
строка1==строка2
Условие выполняется, если строки строка1 и строка2 совпадают. Строки могут быть заданы явно или могут быть пакетными переменными (например,%1). Явно заданные строки нет необходимости заключать в кавычки.
exist имя_файла
Условие выполняется, если существует файл с именем имя_файла.
оп_сравнения
Трехзначный оператор сравнения. В следующей таблице перечислены допустимые значения оп_сравнения.

Оператор Описание
EQU равно
NEQ не равно
LSS меньше
LEQ меньше или равно
GTR больше
GEQ больше или равно
/i
Сравнение строк без учета регистра знаков. Параметр /i можно использовать в конструкции string1==string2 команды if. Эти сравнения являются общими. Если и строка1, и строка2 состоят из цифр, строки преобразовываются в числа и выполняется сравнение чисел.
cmdextversion число
Условие выполняется, только если номер внутренней версии, связанный с расширениями командного процессора Cmd.exe, равен или больше числа. первая версия имела номер 1. Номер версии увеличивается на 1 при внесении в расширения командного процессора значительных изменений. Условие сcmdextversion не выполняется, если расширения командного процессора запрещены (по умолчанию они разрешены).
defined переменная
Условие выполняется, если переменная определена.
выражение
Команда и все ее параметры для обработке в командной строке при выполнении оператора else.
/?
Отображение справки в командной строке.

Заметки

  • Если условие, заданное в команде 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.

Как правильно обрабатывать коды возврата из программ с помощью 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

Добавить комментарий

Error Handling in Batch Script

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

Dragokas


  • #2

Koza Nozdri, видел твои коды.
Очень красивы, но Имхо, бессмысленны с точки зрения отладки ошибок и понимания логики переходов по условиям.

Очень рекомендую множество вложенных условий формировать по уровням,
как это делается на ЯВУ (языках высокого уровня).

Иначе, большая вероятность, потерять скобку.

if "%test%"=="result" (
    тут блок команд
    if "%A%"=="%B%" (
        тут скрипт vbs
    ) else (
        echo error...
    )
) else (
    echo test не равнялся result
)

2IF

Т.е. простейший 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

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Bat down ошибка ивл
  • Bastion ошибка the game had an