If goto windows batch

IF – оператор условного выполнения команд в командных файлах Windows

Формат командной строки:

IF [NOT] ERRORLEVEL число команда

IF [NOT] строка1==строка2 команда

IF [NOT] EXIST имя_файла команда

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; в подобном случае подставляется значение этой переменной.

Читайте также:  Нет плеера windows media player

Создание пустого файла, имя которого задается параметром командной строки.

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


@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

Командный файл, выполняющий опрос командой ping сетевых адресов в заданном диапазоне ( 192.168.1.1 – 192.168.1.254 ). Команда ping формирует значение переменной ERRORLEVEL равное нулю, если верно заданы параметры командной строки. То есть, определить доступность пингуемого IP-адреса методом анализа кода возврата ping не получится, поскольку он будет нулевым, независимо от того, отвечает ли пингуемое устройство, или нет. Поэтому, для решения данной задачи необходимо определить характерный признак, который присутствует в выводимых результатах только в том случае, когда пингуемое устройство доступно. Таким признаком может быть наличие строки символов «TTL» в выводе команды ping. Для определения признака можно использовать команду find в цепочке с командой ping .

Примеры вывода для отвечающего и не отвечающего узлов:

Ответ от 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

)

&nbsp &nbsp В русскоязычной справке команды IF имеется ошибка, которая много лет переходит из версии в версию — вместо оператора EQU — равно , указано EQL — равно

goto goto

Направляет cmd.exe на строку с меткой в пакетной программе. Directs cmd.exe to a labeled line in a batch program. В рамках пакетной программы эта команда направляет обработку команд в строку, обозначенную меткой. Within a batch program, this command directs command processing to a line that is identified by a label. При обнаружении метки обработка продолжится, начиная с команд, начинающихся со следующей строки. When the label is found, processing continues starting with the commands that begin on the next line.

Читайте также:  Linux node что это

Синтаксис Syntax

Параметры Parameters

Параметр Parameter Описание Description
Задает текстовую строку, используемую в качестве метки в пакетной программе. Specifies a text string that is used as a label in the batch program.
/? /? Отображение справки в командной строке. Displays help at the command prompt.

Комментарии Remarks

Если расширения команд включены (по умолчанию) и используется команда goto с целевой меткой : EOF, то управление передается в конец файла текущего пакетного скрипта и выход из файла пакетного сценария без определения метки. If command extensions are enabled (the default), and you use the goto command with a target label of :EOF, you transfer control to the end of the current batch script file and exit the batch script file without defining a label. При использовании этой команды с меткой : EOF необходимо вставить двоеточие перед меткой. When you use this command with the :EOF label, you must insert a colon before the label. Например: goto:EOF . For example: goto:EOF .

В параметре метки можно использовать пробелы, но нельзя включать другие разделители (например, точки с запятой (;) или знаки равенства (=)). You can use spaces in the label parameter, but you can’t include other separators (for example, semicolons (;) or equal signs (=)).

Указанное значение метки должно соответствовать метке в пакетной программе. The label value that you specify must match a label in the batch program. Метка в пакетной программе должна начинаться с двоеточия (:). The label within the batch program must begin with a colon (:). Если строка начинается с двоеточия, она рассматривается как метка, а все команды в этой строке игнорируются. If a line begins with a colon, it’s treated as a label and any commands on that line are ignored. Если программа пакетной службы не содержит метку, указанную в параметре Метка , пакетная программа останавливается и отображает следующее сообщение: Label not found . If your batch program doesn’t contain the label that you specify in the label parameter, then the batch program stops and displays the following message: Label not found .

Для выполнения условных операций можно использовать goto с другими командами. You can use goto with other commands to perform conditional operations. Дополнительные сведения об использовании инструкции goto для условных операций см. в описании команды if. For more information about using goto for conditional operations, see the if command.

Примеры Examples

Следующая пакетная программа форматирует диск в дисководе A как системный диск. The following batch program formats a disk in drive A as a system disk. Если операция выполнена успешно, команда goto направляет обработку в конечную метку: If the operation is successful, the goto command directs processing to the :end label:

Batch Script: Using GOTO on IF statement

When you get to the user input part, no matter what I type (desk, fire, door) it always goes to fireplace. Is there something wrong with my if syntax?

3 Answers 3

Doublequote %choice% or it will not be equal: desk is not equal as «desk» .

And exit your Label block with a goto:eof or exit/b .

Use the /i switch with IF so you can also use DESK or DesK

You need to protect the entry points of each of your target blocks, otherwise when it’s done executing the target block, it will «fall into» the next block.

Before any label line (e.g., :fireplace ), you’ll need a GOTO to make sure that the program flow doesn’t «fall into» the next routine:

Note also the changes to the IF statements. These allow you to handle the case of typing FIRE or Fire instead of just fire .

In addition to the tips from Jeff and SachaDee,
if you name all your labels equal to the choice you could use a loop

Or with a llimited number of choices you could use choice.exe and work with a single letter answer (no enter needed then) and evaluate the returned errorlevel.

Not the answer you’re looking for? Browse other questions tagged batch-file or ask your own question.

Hot Network Questions

Subscribe to RSS

To subscribe to this RSS feed, copy and paste this URL into your RSS reader.

site design / logo © 2021 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2021.4.16.39093

By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.

If goto windows batch

Direct a batch program to jump to a labelled line.

Each GOTO… command must be terminated by a newline.

Although undocumented, GOTO :MySubroutine generally has the same effect as GOTO MySubroutine
or GOTO:MySubroutine (a colon in place of the space)

The eof label is a special case — using GOTO:eof will always transfer execution to the end of the current batch file or the end of the current subroutine.
This can be written as GOTO:eof or GOTO :eof the space is optional.

GOTO EOF and GOTO :EOF are not the same.
if you create a label called eof , the command GOTO:eof will still exit the file/routine and not jump to the label.

The command goto eof (without a colon) will jump to a label called eof , but to avoid confusion it is better to use a different name goto nextsub

When exiting a subroutine, an alternative command is EXIT /b
EXIT /b has the option to set a specific errorlevel, 0 for sucess, 1 or greater for an error.
EXIT /b without an ExitCode acts the same as goto:eof and will not alter the %errorlevel%

Errorlevels

If the jump is successfully made %ERRORLEVEL% = unchanged , typically this will be 0 but if a previous command set an errorlevel, that will be preserved (this is a bug).

If the subroutine Label does not exist %ERRORLEVEL% = 1

Using GOTO within parentheses — including FOR and IF commands — will break their context:

An alternative is to replace the GOTO with a CALL to a subroutine. The subroutine can contain GOTO statements as they will be safely outside the parentheses.

GOTO breaks the & and && redirection operators.

If GOTO a non existent label is used in conjunction with a negative conditional execution, the line containing the GOTO will be executed, but the rest of the Batch file is cancelled:

Just placing a :label within parentheses, can cause errors if the following line is not a valid command, details on SO.

GOTO is an internal command. If Command Extensions are disabled GOTO will no longer recognise the :EOF label

“GOTO. how bad can it be. ”

EXIT — Quit the current script/routine and set an errorlevel.
IF — Conditionally perform a command.
CALL — Call one batch program from another.
Powershell: While (condition) else
Equivalent bash command: case — Conditionally perform a command.

Читайте также:  Safari �������� mac os
Оцените статью