Как использовать if в bat: Урок 5 по CMD — условный оператор if

Содержание

Урок 5 по CMD - условный оператор if

В этой статье мы рассмотрим условный оператор if командной строки (CMD). Как и в любом другом языке программирования, условные оператор служит для проверки заданного условия и в зависимости от результат, выполнять то, или иное действие.

Условный оператор cmd if содержит практически тот же синтаксис, что и аналогичные конструкции языков VBScript (смотри статью “Урок 5 по VBScript: Условный оператор if...else и select...case”) и Jscript (статья “Урок 8 по JScript: Описание условного оператора if...else, арифметических и логических операторов”) сервера сценариев Windows Script Host.

Оператор if командная строка

if условие (оператор1) [else (оператор2)]

Вначале идет проверка условия, если оно выполняется, идет переход к выполнению оператора1, если нет – к оператору2.  Если после ключевого слова if прописать not (if not), то: произойдет проверка условия, если оно не выполниться – переход к оператору1, если условие выполняется – переход к оператору2. Использование круглых скобок не является обязательным, но если вам нужно после проверки условия выполнить сразу несколько операторов cmd if, то круглые скобки необходимы.

Давайте откроем редактор notepad++ и пропишем в нем такой код:

@echo off
if "%1"=="1" (echo odin) else (echo dva)

Как я уже сказал, мы можем использовать не один оператор (командной строки) cmd if, а несколько, посмотрите на данный пример:

@echo off
if "%1"=="1" (hostname & ver & ipconfig /all) else (netstat -a)

Тут, как и прежде идет проверка передаваемого сценарию параметра, если значение равно 1, то произойдет последовательное выполнение трех команд:

  • hostname – выводит имя компьютера
  • ver – выводит версию ОС
  • ipconfig /all – выводит настройки сети

Для последовательного выполнения команд мы использовали знак конкатенации (объединения) “&”. При невыполнении условия произойдет вызов утилиты

netstat.

Что бы проверить существование переменной, используются операторы if defined (если переменная существует) и if not defined (если переменная не существует):

@echo off
set Var1=100
if defined Var1 (echo %Var1%)
set Var1=
if not defined Var1 (echo NOT EXIST!!! Var1)

Если вы запустите на выполнение данный код, то в окне командной строки будут выведены две строки:

100
NOT EXIST!!! Var1

Вначале, в сценарии происходит создание переменной Var1 и присвоение ей значения 100, далее идет проверка: если переменная Var1 существует, вывести ее значение. Потом мы удаляем переменную и снова запускаем проверку: если переменная Var1 не существует, вывести строку NOT EXIST!!! Var1.

Мы вправе использовать условный оператор if как вложенный:

@echo off
if "%1"=="1" (@if "%2"=="2" (hostname & ver) else (ver)) else (hostname & ver & netstat -a)

 

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

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

Давайте теперь посмотрим на такой пример:

@echo off
if "%1"=="slovo" (echo slovo) else (@if "%1"=="SLOVO" (echo SLOVO) else (echo NOT DATA!!!))

Тут идет проверка первого аргумента, и регистр строки учитывается, что бы отключить учет регистра при проверке строк, после оператора if нужно прописать ключ /I:

@echo off
if /I "%1"=="slovo" (echo slovo) else (if /I "%1"=="SLOVO" (echo SLOVO) else (echo NOT DATA!!!))

В данном случае, передадим мы строку SLOVO, slovo, SloVo и так далее, все ровно на экран консоли выведется строка “slovo”, так как учет регистра знаков будет отключен.

Оператор if командная строка, операторы сравнения

Кроме оператора сравнения “==” можно использовать и другие операторы для проверки условия:

  • equ «Равно». Дает True, если значения равны
  • neq «Не равно». Дает True, если значения не равны
  • lss «Меньше». Дает True, если зпачение1 меньше, чем значение2
  • lcq «Меньше или равно». Дает True, если значепие1 равно или меньше, чемзначение2
  • gtr «Больше». Дает True, если значение1 больше, чем значение2
  • geq «Больше или равно». Дает True, если значепие1 равно или больше, чем значение2

В этой статье мы рассмотрели условный оператор командной строки if.

Условия в bat файле

Бывает, что при написании командного файла (пакетного файла, bat файла, cmd файла) требуется записать в условном операторе IF более сложное условие, составленное с помощью операторов И и ИЛИ.

Как известно, bat файлы не имеют таких логических операторов, поэтому в них нельзя написать конструкции типа:

Эта статья рассказывает, как в bat файле реализовать логику операторов И / ИЛИ другими доступными способами.

Надо сказать, что всё-таки командные файлы Windows предназначены для пакетного выполнения консольных команд, и задачи по расчету или обработке данных лучше писать в скриптах (PowerShell, WSH / JScript / VBScript), вызывая их из bat файла.

Ссылки для скачивания файлов находятся в конце статьи.

Оператор IF с логическим И (AND) в bat файле

Самый простой вариант – вложенное выполнение двух операторов IF:

То есть вместо and мы просто пишем if. Можно использовать не только проверку значения переменной, но и проверку наличия файла. Условий может быть больше двух.

Оператор IF с логическим ИЛИ (OR) в bat файле

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

Способ 1 – через последовательные ИЛИ

Каждое условие записывается в отдельный IF, каждый из которых заносит результат в общую переменную. В итоге, если было выполнено хотя бы одно из условий, в общей переменной будет этот результат.

В примере ниже значение переменной a сравнивается с тремя значениями, и для любого из value1, value2, value3 условие будет выполнено. А если задать a какое-то другое значение, например, set a=value4, то условие выполнено не будет, что нам и нужно:

Способ 2 — через И и НЕ

Этот способ основан на том факте, что логическую операцию ИЛИ можно представить через операции И и НЕ, например, a OR b эквивалентно NOT ( NOT A AND NOT B ). Оператор NOT уже есть в bat файлах, а оператор AND можно представить через последовательные IF, как мы видели выше.

Поэтому тот же результат можно получить по-другому:

Этот способ занимает немного меньше строк, чем предыдущий.

Файлы для скачивания

Все файлы, описанные в статье, можно скачать с Яндекс.Диска.

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

Синтаксис

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

Параметры

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 Готово!

Операторы сравнения оп_сравнения также можно использовать следующим образом:

%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем

cmdcmdline. В этом случае будет использовано значение cmdcmdline.

%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.

Использование оператора else

Оператор else должен размещаться в той же строке, что и команда if. Пример:

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

IF EXIST имя_файла. del имя_файла. ELSE echo имя_файла. отсутствует

Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:

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). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

Далее кратко описаны полезные возможности, которые можно использовать в командных файлах (*.bat;*.cmd aka батники) операционных систем Windows 2000, XP, 2003 и более поздних.

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

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

Более подробную помощь нежели в данном обзоре можно найти в стандартной справке в каталоге Windows.
(Типичный путь к файлу справки: C:WINDOWSHelp
tcmds.chm. Если Windows установлена в каталог, отличный от C:WINDOWS, то ссылки на справку из данной страницы работать не будут. Потребуется открыть справку самостоятельно.)
В частности, крайне полезно почитать следующие разделы:

Справку по конкретной команде также всегда можно получить набрав в командной строке " /?".
Например, очень познавательно почитать то, что выдается в результате команд set /?, call /?, for /?, if /?.

Помощь приводится на языке установленной операционной системы.

Вывод
Текущий каталог
Параметры вызова сценариев

Например, после вызова будем иметь следующую картину:

ПараметрЗначение
%0d:deltalngscompile_all.cmd
%1sol.dpr
%2. (точка)
%3,%4,%5 и т.д.(пусты)
%*sol.dpr .

Современные ОС используют расширенный режим обработки параметров, в котором доступны следующие модификаторы:

МодификаторОписание
расширение %1 и удаление любых кавычек ("")
замена %1 полным путем
замена %1 именем диска
замена %1 путем без диска и имени файла
замена %1 именем файла без расширения
замена %1 расширением имени файла
замена полным путем, содержащим только короткие имена
замена %1 атрибутами файла
замена %1 датой и временем модификации файла
замена %1 размером файла
Поиск в каталогах, перечисленных в переменной среды PATH, замена %1 полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку.

Описанные модификаторы можно применять в различных сочетаниях для всех параметров. Например:

МодификаторОписание
полный путь (включая завершающий слэш) к каталогу выполняемого скрипта
имя файла первого параметра с расширением
размер файла второго параметра
замена %1 строкой, аналогичной результату работы программы dir
Проверка условий

Проверка существования файла:
if [not] exist имя_файла команда [else выражение]
Например: if exist $result$.txt del $result$.txt

Проверка кода возврата:
if [not] errorlevel число команда [else выражение]
Условие верно, если предыдущая обработанная команда завершилась с кодом, равным или большим значения число.
Например:

Использование меток

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

Запуск команд

Инструкция "cmd команда" запускает системный пакетный обработчик cmd.exe для выполнения команды команда.
Если вызов происходит из консоли, то используется имеющаяся, если нет — создается новая.
Ключи /c и /k указывают, что по завершении исполнения консоль нужно закрыть или оставить, соответственно.

Инструкция "start команда" запускает обработку команды команда в отдельном параллельном процессе.
Соответствующие ключи позволяют изменять приоритет запускаемого процесса.
Ключ /wait указывает, что запустившему процессу следует дождаться завершения запущенного.

Запускать новые командные сценарии из командных сценариев можно также двумя способами.
Первый: Второй:

Код возврата команд

Команда exit число прерывает исполнение текущего сценария с возвратом запустившему его процессу заданного кода выхода. По умолчанию производится прерывание сразу всей цепочки вызовов пакетных сценариев. Если необходимо завершить только текущий сценарий и возвратить управление в сценарий, вызвавший его командой call, то нужно использовать ключ /b команды exit. Для выхода из сценария с передачей вызвавшему процессу текущего значения %errorlevel% необходимо использовать команду goto :eof.

Некоторые команды всегда устанавливают переменную %errorlevel%, некоторые модифицируют ее только при возникновении ошибок, а некоторые вообще ее никогда не меняют.
Вот пример:

Копирование

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

Использование нескольких команд и символов условной обработки

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

-10%

0,-2%

Для установки значений переменных используется команда set.
Установка значений:
set переменная=значение
Показ значений:
set переменная
Показ значений всех переменных:
set (без параметров)
Проверка наличия переменной с заданным именем:
if defined переменная команда

Вычисление арифметических выражений

В следующей таблице представлены арифметические операторы, поддерживающие параметр /a , в порядке убывания приоритета. заключайте выражение в кавычки.
Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразуются в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.

Пример использования вычисления выражений:

Потоки ввода/вывода

Потоки используются в командных сценариях для унифицированного распределения и перенаправления ввода/вывода.

В следующей таблице представлены стандартные потоки.

СимволСинтаксисОпределение
& [. ]команда1 & команда2Выполняется первая команда, затем вторая команда.
&& [. ]команда1 && команда2Вторая команда выполняется, только если первая была выполнена успешно.
|| [. ]команда1 || команда2Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль). или кавычки, если эти символы передаются в качестве аргументов.

Вот пример специализированного скрипта для сравнения файлов:

Использование переменных среды

Глобальные переменные устанавливаются в свойствах операционной системы или специальной внешней утилитой setx и доступны с одними и теми же значениями при запуске всех пакетных файлов.

Локальные переменные устанавливаются и используются по-своему в каждом отдельном сценарии, сохраняются только во время его выполнения, а также передаются в дочерние сценарии при вложенных вызовах.

Псевдопеременные, такие как %CD%, %DATE%, %TIME%, %RANDOM%, %ERRORLEVEL%, обрабатываются особенным образом в зависимости от определенных условий.

В следующей таблице приведен выборочный список наиболее интересных переменных среды.

ПеременнаяТипОписание
ЛокальнаяВозвращает путь к текущей папке.
СистемнаяВозвращает имя компьютера.
СистемнаяВозвращает текущую дату. Использует тот же формат, что и команда date /t .
СистемнаяВозвращает код ошибки последней использовавшейся команды.
СистемнаяУказывает путь поиска для исполняемых файлов.
СистемнаяВозвращает произвольное десятичное число от 0 до 32767.
СистемнаяВозвращает размещение системного каталога Windows.
иСистемная и пользовательскаяВозвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP.
СистемнаяВозвращает текущее время. Использует тот же формат, что и команда time /t .
ЛокальнаяВозвращает имя пользователя, выполнившего вход в систему.

При использовании переменных можно также использовать выделение подстрок.

КонструкцияНазначение
%PATH:

10,5%

расширит действие переменной среды PATH, затем использует только 5 символов, которые начинаются с 11-го символа (пропустив 10) расширенного результата. Если длина не указана, по умолчанию используется оставшееся значение переменной. Если оба значения (длина и число пропускаемых символов) отрицательны, следующим используемым значением будет длина значения переменной среды, добавленной к указанному значению пропуска или указанной длины.
%PATH:
извлечет последние 10 символов переменной PATH
%PATH:
извлечет все символы переменной PATH, за исключением 2-х последних
ПотокНомер дескриптораОписание
STDINСтандартный ввод (только чтение)
STDOUT1Стандартный вывод (только запись)
STDERR2Вывод ошибок (только запись)

Каждый поток может быть связан с каким-либо устройством ввода/вывода.

В следующей таблице представлены стандартные устройства.

УстройствоОписание
CONКонсоль (чтение с клавиатуры и вывод на экран)
NULПустота
PRNПринтер

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

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

Оператор перенаправленияОписание
>Перенаправление вывода с затиранием.
Перенаправление ввода.
>>Перенаправление вывода с добавлением.
>&Считывает данные на выходе одного потока как входные данные для другого потока.
Считывает входные данные одного потока как выходные данные другого потока.
|Считывает выходные данные одной команды и записывает их на вход другой команды. Эта процедура известна под названием "канал".

Некоторые команды, такие как find, sort, more, называются фильтрами, т.к. они занимаются специализированной трансформацией входного потока в выходной.

Далее приведены некоторые примеры.

Типичный вызов при тестировании программистских задач.
(Ввод из input.txt, вывод в output.txt, вывод ошибок в никуда).

Вызов скрипта компиляции с перенаправлением потоков вывода и ошибок на дописывание в файл compile.log.

Дописывание содержимого одного файла в конец другого.

Поэкранный вывод списка элементов текущего каталога.

Поэкранный вывод имен всех фидошников города Гомеля, отсортированных по алфавиту.

Организация циклов

Команда for позволяет произвести запуск некоторой команды для каждого элемента из заданного множества.
Синтаксис:

Параметры: < % переменная | %% переменная >Обязательный параметр. Замещаемый параметр. Используйте % переменная для выполнения команды for из командной строки. В пакетных файлах для команды FOR используется запись %%переменная вместо %переменная. Имена переменных учитывают регистр букв (%i отличается от %I). ( множество ) Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными. команда Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога диапазона значений или текстовой строки, включенной в указанный параметр ( множество ) . ПараметрыКоманднойСтроки Задает параметры командной строки, которые используются с указанной командой.
Подробнее команда описана в справке. Здесь приведены несколько примеров, иллюстрирующих ее возможности.

Перебор фиксированного множества параметров.

Итерация по файлам.

Итерация по каталогам.

Итерация и разбор файлов

Набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбивки его на отдельные строки текста и выделения из каждой строки заданного числа подстрок (в том числе нуля). Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла. По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр "options" служит для переопределения заданных по умолчанию правил обработки строк.
Возможные ключевые слова для этого параметра:

Описание
eol=cЗадает символ конца строки (только один символ).
skip=nЗадает число строк, пропускаемых в начале файла.
delims=xxxЗадает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции.
Задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. В результате размещаются дополнительные имена переменных. Форма m-n задает диапазон, указывающий элементы с m -го по n -ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента.
usebackqЗадает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов . Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках — как команды в символьной строке.

Поясняющий пример:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
Эта команда обрабатывает файл myfile.txt, пропускает все строки, которые начинаются с символа точки с запятой, и передает вторую и третью подстроки из каждой строки в тело цикла, причем подстроки разделяются запятыми и/или пробелами. В теле цикла переменная %i используется для второй подстроки, %j – для третьей, а %k получает все оставшиеся подстроки после третьей. Имена файлов, содержащие пробелы, необходимо заключать в двойные кавычки. Для того чтобы использовать двойные кавычки, необходимо использовать параметр usebackq, иначе двойные кавычки будут восприняты как границы строки для обработки.

Синтаксис команды FOR /F также позволяет обработать отдельную строку, с указанием параметра filenameset, заключенным в одиночные кавычки. Строка будет обработана как единая строка из входного файла.

Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует ввести строку вызова команды в апострофах вместо набора имен файлов в скобках. Строка передается для выполнения обработчику команд CMD.EXE, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующая команда:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
выведет перечень имен всех переменных среды, определенных в настоящее время в системе.

Еще один пример:

Организация блокировок
Установка цвета консоли

(CopyLeft) Vadim Kopichenko

Операторы AND / OR в bat файлах

Бывает, что при написании командного файла (пакетного файла, bat файла, cmd файла) требуется записать в условном операторе IF более сложное условие, составленное с помощью операторов И и ИЛИ.

Как известно, bat файлы не имеют таких логических операторов, поэтому в них нельзя написать конструкции типа:

if "%var1%" == "value1" and %var2% == "value2" ...

Эта статья рассказывает, как в bat файле реализовать логику операторов И / ИЛИ другими доступными способами.

Надо сказать, что всё-таки командные файлы Windows предназначены для пакетного выполнения консольных команд, и задачи по расчету или обработке данных лучше писать в скриптах (PowerShell, WSH / JScript / VBScript), вызывая их из bat файла.

Ссылки для скачивания файлов находятся в конце статьи.

Оператор IF с логическим И (AND) в bat файле

Самый простой вариант – вложенное выполнение двух операторов IF:

if "%var1%" == "value1" if %var2% == "value2" ...

То есть вместо and мы просто пишем if. Можно использовать не только проверку значения переменной, но и проверку наличия файла. Условий может быть больше двух.

Пример:

if "%a%" == "backup" if "%b%" == "true" if not exist "backup.dat" echo Условие выполнено

Оператор IF с логическим ИЛИ (OR) в bat файле

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

Способ 1 – через последовательные ИЛИ

Каждое условие записывается в отдельный IF, каждый из которых заносит результат в общую переменную. В итоге, если было выполнено хотя бы одно из условий, в общей переменной будет этот результат.

В примере ниже значение переменной a сравнивается с тремя значениями, и для любого из value1, value2, value3 условие будет выполнено. А если задать a какое-то другое значение, например, set a=value4, то условие выполнено не будет, что нам и нужно:

if "%a%" == "value1" set res=true
if "%a%" == "value2" set res=true
if "%a%" == "value3" set res=true
if defined res ( 
    echo Условие выполнено
) else (
    echo Условие не выполнено
)

Способ 2 — через И и НЕ

Этот способ основан на том факте, что логическую операцию ИЛИ можно представить через операции И и НЕ, например, a OR b эквивалентно NOT ( NOT A AND NOT B ). Оператор NOT уже есть в bat файлах, а оператор AND можно представить через последовательные IF, как мы видели выше.

Поэтому тот же результат можно получить по-другому:

set res=true
if not "%a%" == "value1" if not "%a%" == "value2" if not "%a%" == "value3" set res=false
if "%res%"=="true" (
    echo Условие выполнено
) else (
    echo Условие не выполнено
)

Этот способ занимает немного меньше строк, чем предыдущий.

Файлы для скачивания

Все файлы, описанные в статье, можно скачать с Яндекс.Диска.

if | Microsoft Docs

  • Чтение занимает 2 мин

В этой статье

Выполняет условную обработку в пакетных программах.

Синтаксис

if [not] ERRORLEVEL <number> <command> [else <expression>]
if [not] <string1>==<string2> <command> [else <expression>]
if [not] exist <filename> <command> [else <expression>]

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

if [/i] <string1> <compareop> <string2> <command> [else <expression>]
if cmdextversion <number> <command> [else <expression>]
if defined <variable> <command> [else <expression>]

Параметры

Параметр Описание
not Указывает, что команда должна выполняться, только если условие имеет значение false.
ERRORLEVEL <number> Задает истинное условие, только если предыдущая программа, выполненная Cmd.exe, вернула код выхода, который больше или равен Number.
<command> Указывает команду, которая должна быть выполнена при выполнении предыдущего условия.
<string1>==<string2> Задает истинное условие, только если строка1 и строка2 совпадают. Эти значения могут быть строками литерала или пакетными переменными (например, %1 ). Литеральные строки не нужно заключать в кавычки.
существующие <filename> Указывает истинное условие, если указанное имя файла существует.
<compareop> Задает оператор сравнения из трех букв, включая:
  • Равно — равно
  • Нек — не равно
  • ЛСС — меньше
  • LEQ -меньше или равно
  • ГТР — больше
  • Жек — больше или равно
/i Принудительное сравнение строк не учитывает регистр. Параметр /i можно использовать в string1==string2 формате If. Эти сравнения являются универсальными, в том случае, если и строка1 , и строка2 состоят из цифр, строки преобразуются в числа и выполняется числовое сравнение.
кмдекстверсион <number> Задает истинное условие, только если внутренний номер версии, связанный с компонентом расширения команд Cmd.exe, равен или больше указанного числа. Первая версия — 1. Он увеличивается на единицу при добавлении значительных улучшений в расширения команд. Кмдекстверсион Conditional не имеет значения true, если расширения команд отключены (по умолчанию расширения команд включены).
defined <variable> Указывает истинное условие, если переменная определена.
<expression> Задает команду командной строки и все параметры, которые будут переданы команде в предложении else .
/? Отображение справки в командной строке.
Remarks
  • Если условие, указанное в предложении If , имеет значение true, выполняется команда, следующая за условием. Если условие имеет значение false, команда в предложении If игнорируется и команда выполняет любую команду, указанную в предложении else .

  • Когда программа останавливается, она возвращает код выхода. Чтобы использовать коды выхода в качестве условий, используйте параметр ERRORLEVEL .

  • При использовании определенного значения в среду добавляются следующие три переменные: % ERRORLEVEL%, % кмдкмдлине% и % кмдекстверсион%.

    • % ERRORLEVEL%: разворачивается в строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что отсутствует существующая переменная среды с именем ERRORLEVEL. Если это так, вместо него будет получено значение ERRORLEVEL.

    • % кмдкмдлине%: разворачивается в исходную командную строку, которая была передана Cmd.exe до любой обработки Cmd.exe. Предполагается, что отсутствует существующая переменная среды с именем КМДКМДЛИНЕ. Если это так, вы получите вместо этого значение КМДКМДЛИНЕ.

    • % кмдекстверсион%: разворачивается в строковое представление текущего значения кмдекстверсион. Предполагается, что отсутствует существующая переменная среды с именем КМДЕКСТВЕРСИОН. Если это так, вы получите вместо этого значение КМДЕКСТВЕРСИОН.

  • Предложение else необходимо использовать в той же строке, что и команда после оператора If.

Примеры

Чтобы отобразить сообщение не удается найти файл данных если не удается найти файл Product. dat, введите:

if not exist product.dat echo Cannot find data file

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

:begin
@echo off
format a: /s
if not errorlevel 1 goto end
echo An error occurred during formatting.
:end
echo End of batch program.

Чтобы удалить файл Product. dat из текущего каталога или отобразить сообщение, если Product. dat не найден, введите в пакетном файле следующие строки:

IF EXIST Product.dat (
del Product.dat
) ELSE (
echo The Product.dat file is missing.
)

Примечание

Эти строки можно объединить в одну строку следующим образом:

IF EXIST Product.dat (del Product.dat) ELSE (echo The Product.dat file is missing.)

Чтобы вывести значение переменной среды ERRORLEVEL после выполнения пакетного файла, введите в пакетный файл следующие строки:

goto answer%errorlevel%
:answer1
echo The program returned error level 1
goto end
:answer0
echo The program returned error level 0
goto end
:end
echo Done!

Чтобы вернуться к метке "хорошо", если значение переменной среды ERRORLEVEL меньше или равно 1, введите:

if %errorlevel% LEQ 1 goto okay

Дополнительные ссылки

Условный оператор IF - как грамотно оформить код | SafeZone

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 (под спойлером) на сколько хорошо прослеживается логика вложенных условий.

 

Статья - Переменные в CMD, команда SET и арифметика | SafeZone

Переменные. Команда SET


Задание переменных

Вручную

Ввод с клавиатуры
set /p x="BBeduTe cTpoky: "

Типы переменных

Тип строка

Ограничение 8184 символа.17)-1)

set /a random10=%random%/3277
Выводит случайное число от 0 до 9.
У меня это число по нелепой псевдослучайности цифру секунды
%CD% - раскрывается в строку текущей директории.
%DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME.
%ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL.
Уровень ошибки, 0 - это нет ошибки, 1 - это есть ошибка, а другие это номера ошибки.

Чтобы получить полный список переменных и их значений введите команду SET

Операции со строковыми или численными переменными

Соединение 2-ух строковых переменных

set x=Gaz
set y=Prom
echo %x%%y%
(GazProm)

Вывод определенного(ых) символа(ов) из строки
Символы номеруются начиная с 0!
Вывод 1-ого символа

Вывод 3-х символов с конца строки

Вывод всей строки кроме 2-ух первых символов

Вывод всей строки кроме 2-ух последних символов

Вывод 3-х символов начиная с 3

Удаление подстроки из строки
set str=babywka
echo %str:ba=%
(bywka)

Замена подстроки из строки на другую подстроку
set str=babywka
echo %str:bab=xlop%
(xlopywka)

Удаление кавычек(") из строки
set str2="qwerty"
echo %str2:"=%
(qwert)
В данном случае: если кавычки в начале и конце строки - можно юзать
echo %str2:~1,-1%
(qwert)

Существуют 2 способа использовать переменную в переменной, например: вывод n-ого символа

Первый способ с call set

call set x=%%str:~%n%,1%%
echo %x%

Второй способ с for и setlocal enabledelayedexpansion
setlocal enabledelayedexpansion
for /l %%i in (%n%,1,%n%) do (set x=!str:~%%i,1!)
echo %x%
тут неважно что в for писать, главное писать в do
С циклами мы разберемся в следующей статье.
Но, пока уточню: если код второго способа юзать в пакетном файле (BATнике), то вместо %i юзаем %%i.

Операции с числовыми переменными

Увеличивание на единицу


Увеличивание в 2 раза
аналогично

Возведение в квадрат

Возведение в куб

Деление
Деление в CMD является целочисленным!(то есть делится до целого числа)
set /a x=15
set /a y=4
set /a xy=%x%/%y%
(3)

Сложение
set /a x=5
set /a y=-6
set /a xy=%x%+%y%
(5+(-6)=5-6=-1)

Вычитание
set /a x=5
set /a y=-6
set /a xy=%x%-%y%
(5-(-6)=5+6=11)

Вычисление остатка

Унарные операторы

Логическое отрицание (Logical NOT)

дает результат(%y%) 1 (True), если переменная(%x%) равна 0 (False), и 0 (False) (%y%) в любых других случаях
Например
set /a x=5
set /a y="!"%x%
(0)
set /a x=0
set /a y="!"%x%
(1)

Побитовая инверсия (Bitwise NOT):
дает результат -1-%x% (%y%)
Например
set /a x=5
set /a y="~"%x%
(-1-5=-(1+5)= -6)
set /a x=-3
set /a y="~"%x%
(-1-(-3)=-1+3=3-1= 2)

Унарный минус (устанавливает/сбрасывает знаковый бит)
дает результат 0-%x% (%y%)
Например
set /a x=5
set /a y="-"%x%
(-5)
set /a x=-3
set /a y="-"%x%
(3)

Двоичные операторы
set x=3
(в двоичной системе счисления - 0011)
set y=5
(в двоичной системе счисления - 0101)

Побитовое И (AND)

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.

set /a xy=%x%"&"%y%
(1, в двоичной системе счисления - 0001)

Побитовое ИЛИ (OR)

Побитовое ИЛИ — это бинарная операция, действие которой эквивалентно применению логического ИЛИ к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов.
Другими словами, если оба соответствующих бита операндов равны 0, двоичный разряд результата равен 0; если же хотя бы один бит из пары равен 1, двоичный разряд результата равен 1.

set /a xy=%x%"|"%y%
(7, в двоичной системе счисления - 0111)

Побитовое исключающее ИЛИ (XOR)

Побитовое исключающее ИЛИ (или побитовое сложение по модулю два) — это бинарная операция, действие которой эквивалентно применению логического исключающего ИЛИ к каждой паре битов, которые стоят на

одинаковых позициях в двоичных представлениях операндов."%y% (6, в двоичной системе счисления - 0110)
К битовым операциям также относят битовые сдвиги. При сдвиге значения битов копируются в соседние по направлению сдвига.
Различают сдвиг влево (в направлении от младшего бита к старшему) и вправо (в направлении от старшего бита к младшему).
При логическом сдвиге значение последнего бита по направлению сдвига теряется (копируясь в бит переноса), а первый приобретает нулевое значение.

Двоичный арифметический сдвиг

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

Вправо

set /a xy=%x%">>"1
(1, в двоичной системе счисления - 0011->0001)
set /a xy2=%y%">>"1
(2, в двоичной системе счисления - 0101->0010)
set /a n=13
(в двоичной системе счисления - 1101)
set /a xn=%n%">>"2
(3, в двоичной системе счисления - 1101->0011)
set /a my=-%y%">>"1
(-3, в двоичной системе счисления - 1011(-5)->1101(-3))

Влево
set /a xy=%x%"<<"1
(6, в двоичной системе счисления - 0011->0110)
set /a xy2=%y%"<<"1
(10, в двоичной системе счисления - 0101->1010)
set /a xy3=%y%"<<"4
(80, в двоичной системе счисления - 0101->1010000)
set /a my=-%y%"<<"1
(-10, в двоичной системе счисления - 1011(-5)->10110(-10))

Максимальный размер отдельной переменной среды составляет 8192 байта.(у меня выходило только 8184, наверное это вместе с названием...)
Максимальный общий размер всех переменных среды, включая имена переменных и знак равенства, составляет 65 536 Кбайт.

И я забыл, про 8-ричную и 16-ричную систему счисления в CMD

Системы счисления

Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.

Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются.

Восьмеричная система счисления

set /a x=022
(Это 22 в восьмеричной системе счисления, и 18 в десятичной)
Можно производить все операции, также как и с десятеричными числами.
Но после задания значения переменной, значение хранится в десятичной системе счисления.
Например, сложение
set /a xy=022+07
(Это 22+7=31 в восьмеричной системе счисления, и 31 в десятичной)

Шестнадцатеричная система счисления
set /a x=0x3A
(Это 3A в восьмеричной системе счисления, и 58 в десятичной)
Вычитание
set /a xy=0x3A-0x66
(Это 3A-66=-54 в восьмеричной системе счисления, и -44 в десятичной)

Сохранение в переменной вывода программы
К сожаление, передача вывода программ на вход команды set не работает:
echo 1|set /p AA=""
set AA
Поэтому можно воспользоваться временным сохранением в файл:
echo 1> 0.<rar.log.tmp') do @echo %%J >rarfilename.tmp
set /p rarfilename="" <rarfilename.tmp
del rarfilename.tmp

Узнать имя последнего изменённого файла в папке:
dir /b /a-d /o-d *.* >%temp%\0.tmp
set /p lastfile="" <%temp%\0.tmp
del %temp%\0.tmp
echo "%lastfile%"

Комментарий от Dragokas :
По сути эта команда считывает в переменную первую строку файла:

Комментарий от m00slim25:
Эти операции, как и все остальные, поддерживают кавычный синтаксис:
set /a "y=!%x%"
set /a "y=~%x%"
set /a "y=-%x%"

Оператор == используется только для строчного сравнения. Кавычки необходимы если в переменной/операнде имеются пробелы.
Для арифметического сравнения необходимо использовать арифметические операторы:
EQU : Равно (=)
NEQ : Не равно (!=)
LSS : Меньше (
LEQ : Меньше или равно (
GTR : Больше (>)
GEQ : Больше или равно (>=)
Использовать операторы, указанные в скобках, не представляется возможным, потому что, например, операторы < и > являются указателями перенаправления ввода-вывода.

Cmd if else примеры

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

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

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

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


@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 – равно

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

Синтаксис

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

Параметры

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 после выполнения пакетной программы:

Операторы сравнения оп_сравнения также можно использовать следующим образом:

%cmdcmdline% замещается исходной командной строкой, переданной Cmd.exe, до ее обработки в Cmd.exe, если только уже не существует переменная среды с именем cmdcmdline. В этом случае будет использовано значение cmdcmdline.

%cmdextversion% замещается строковым представлением текущего значения cmdextversion, если только уже не существует переменная среды с именем CMDEXTVERSION. В этом случае будет использовано ее значение.

Использование оператора else

Оператор else должен размещаться в той же строке, что и команда if. Пример:

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

Приведенный ниже пример не будет работать, поскольку команда else должна находиться в той же строке, что и команда if:

Если необходимо разместить всю инструкцию в одной строке, можно использовать следующую правильную форму исходной инструкции:

Примеры

Если файл Product.dat не удается найти, появится следующее сообщение:

Если в приведенном ниже примере при форматировании диска в дисководе A возникнет ошибка, будет выведено сообщение об ошибке:

Если ошибка не возникнет, сообщение об ошибке выведено не будет.

Команда if не может быть использована непосредственно для проверки существования каталога, но в каждом каталоге существует устройство (NUL). Следовательно, существование каталога может быть проверено, как показано ниже. В следующем примере проверяется наличие каталога:

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

Conditionally perform a command.

IF will only parse numbers when one of (EQU, NEQ, LSS, LEQ, GTR, GEQ) is used.
The == comparison operator always results in a string comparison.

ERRORLEVEL

There are two different methods of checking an errorlevel, the first syntax ( IF ERRORLEVEL . ) provides compatibility with ancient batch files from the days of Windows 95.
The second method is to use the %ERRORLEVEL% variable providing compatibility with Windows 2000 or newer.

IF ERRORLEVEL n statements should be read as IF Errorlevel >= number
i.e.
IF ERRORLEVEL 0 will return TRUE whether the errorlevel is 0, 1 or 5 or 64
IF ERRORLEVEL 1 will return TRUE whether the errorlevel is 1 or 5 or 64
IF NOT ERRORLEVEL 1 means if ERRORLEVEL is less than 1 (Zero or negative).
This is not very readable or user friendly and does not easily account for negative error numbers.

Using the %ERRORLEVEL% variable is a more logical method of checking Errorlevels:

IF %ERRORLEVEL% NEQ 0 Echo An error was found
IF %ERRORLEVEL% EQU 0 Echo No error found

IF %ERRORLEVEL% EQU 0 (Echo No error found) ELSE (Echo An error was found)
IF %ERRORLEVEL% EQU 0 Echo No error found || Echo An error was found

This allows you to trap errors that can be negative numbers, you can also test for specific errors:
IF %ERRORLEVEL% EQU 64 .

To deliberately raise an ERRORLEVEL in a batch script use the EXIT /B command.

It is possible (though not a good idea) to create a string variable called %ERRORLEVEL% (user variable)
if present such a variable will prevent the real ERRORLEVEL (a system variable) from being used by commands such as ECHO and IF.

Test if a variable is empty

To test for the existence of a command line parameter – use empty brackets like this

IF [%1]==[] ECHO Value Missing
or
IF [%1] EQU [] ECHO Value Missing

When comparing against a variable that may be empty, we include a pair of brackets [ ] so that if the variable does happen to be empty the IF command still has something to compare: IF [] EQU [] will return True.

You can in fact use almost any character for this a ‘

‘ or curly brackets, < >or even the number 4, but square brackets tend to be chosen because they don’t have any special meaning.
When working with filenames/paths you should always surround them with quotes, if %_myvar% contains "C:Some Path" then your comparison becomes IF ["C:Some Path"] EQU []
if %_myvar% could contain empty quotes, "" then your comparison should become IF [%_myvar%] EQU [""]

if %_myvar% will never contain quotes, then you can use quotes in place of the brackets IF "%_myvar%" EQU ""
However with this pattern if %_myvar% does unexpectedly contain quotes, you will get IF ""C:Some Path"" EQU "" those doubled quotes, while not officially documented as an escape will still mess up the comparison.

Test if a variable is NULL

In the case of a variable that might be NULL – a null variable will remove the variable definition altogether, so testing for a NULL becomes:

IF NOT DEFINED _example ECHO Value Missing

IF DEFINED will return true if the variable contains any value (even if the value is just a space)

To test for the existence of a user variable use SET VariableName , or IF DEFINED VariableName

Test the existence of files and folders

IF EXIST filename Will detect the existence of a file or a folder.

The script empty.cmd will show if the folder is empty or not (this is not case sensitive).

Parenthesis

Parenthesis can be used to split commands across multiple lines. This enables writing more complex IF… ELSE… commands:

When combining an ELSE statement with parentheses, always put the opening parenthesis on the same line as ELSE.
) ELSE ( This is because CMD does a rather primitive one-line-at-a-time parsing of the command.

When using parentheses the CMD shell will expand [read] all the variables at the beginning of the code block and use those values even if the variables value has just been changed. Turning on DelayedExpansion will force the shell to read variables at the start of every line.

Pipes

When piping commands, the expression is evaluated from left to right, so

IF SomeCondition Command1 | Command2 is equivalent to:

(IF SomeCondition Command1 ) | Command2
The pipe is always created and Command2 is always run, regardless whether SomeCondition is TRUE or FALSE

You can use brackets and conditionals around the command with this syntax:

IF SomeCondition (Command1 | Command2)
If the condition is met then Command1 will run, and its output will be piped to Command2.

The IF command will interpret brackets around a condition as just another character to compare (like # or @) for example:
IF (%_var1%==(demo Echo the variable _var1 contains the text demo

Placing an IF command on the right hand side of a pipe is also possible but the CMD shell is buggy in this area and can swallow one of the delimiter characters causing unexpected results.
A simple example that does work:

Echo Y | IF red==blue del *.log

Chaining IF commands (AND).

The only logical operator directly supported by IF is NOT , so to perform an AND requires chaining multiple IF statements:

If either condition is true (OR)

This can be tested using a temporary variable:

Set "_tempvar="
If SomeCondition Set _tempvar=1
If SomeOtherCondition Set _tempvar=1
if %_tempvar% EQU 1 Command_to_run_if_either_is_true

Delimiters

If the string being compared by an IF command includes delimiters such as [Space] or [Comma], then either the delimiters must be escaped with a caret ^ or the whole string must be "quoted".
This is so that the IF statement will treat the string as a single item and not as several separate strings.

Test Numeric values

IF only parses numbers when one of the compare-op operators ( EQU, NEQ, LSS, LEQ, GTR, GEQ ) is used.
The == comparison operator always results in a string comparison.

This is an important difference because if you compare numbers as strings it can lead to unexpected results: "2" will be greater than "19" and "026" will be less than "10".

Correct numeric comparison:
IF 2 GEQ 15 echo "bigger"

Using parentheses or quotes will force a string comparison:
IF (2) GEQ (15) echo "bigger"
IF "2" GEQ "15" echo "bigger"

This behaviour is exactly opposite to the SET /a command where quotes are required.

Wildcards

Wildcards are not supported by IF, so %COMPUTERNAME%==SS6* will not match SS64

A workaround is to retrieve the substring and compare just those characters:
SET _prefix=%COMPUTERNAME:

0,3%
IF %_prefix%==SS6 GOTO they_matched

If Command Extensions are disabled IF will only support direct comparisons: IF ==, IF EXIST, IF ERRORLEVEL
also the system variable CMDEXTVERSION will be disabled.

IF does not, by itself, set or clear the Errorlevel.

IF is an internal command.

You see things; and you say ‘Why?’ But I dream things that never were; and I say ‘why not?’

George Bernard Shaw

Using parentheses to group and expand expressions.
Conditional execution syntax (AND / OR)
SET – Display or Edit environment variables.
ECHO – Display message on screen.
EXIT – Set a specific ERRORLEVEL.
IFMEMBER – group member (Resource kit).
SC – Is a Service running (Resource kit).
Powershell: if – Conditionally perform a command.
Equivalent bash command (Linux): if – Conditionally perform a command.

Batch File If Else - Как использовать if else при программировании командных файлов?

В этом руководстве вы узнаете о структурах принятия решений, которые представляют собой командный файл , если еще операторы .

В основном логика программирования - это Истина (1) или Ложь (0). Как и любой другой язык программирования, операторы командного файла if else помогают нам принять решение между истинным / ложным или несколькими вариантами путем наложения определенного условия.

Пакетный файл, если оператор else

- Синтаксис

  если (условие) что-то делать

:: Ибо если..else если
если (условие) (оператор1) еще (оператор2)  

Итак, как показывает синтаксис, сначала проверяется условие, и если оно истинно, соответствующие операторы выполняются в операторе if пакетного файла. Что касается пакетного файла , если иначе , сначала проверяется условие оператора if, а если оно истинно, то выполняется оператор , , иначе выполняется оператор , оператор 2, .

Пакетный файл, если еще блок-схема

Вот блок-схема, подчеркивающая концепцию оператора if else .

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

Пакетный файл, если еще Пример: проверка целочисленных и строковых переменных

Чтобы получить более подробную информацию о переменных командного файла, прочтите эту статью.

  НАБОР / A a = 2
НАБОР / A b = 3
НАБОР name1 = Aston
НАБОР name2 = Мартин

:: Использование оператора if
IF% a% == 2 echo Значение a равно 2
ЕСЛИ% name2% == Мартин эхо Привет, это Мартин

:: Использование операторов if else
ЕСЛИ% a% ==% b% (числа эхо-сигналов равны) ИНАЧЕ (номера эхо-сигналов разные)
IF% name1% ==% name2% (имя эха такое же) ELSE (имя эха другое)
ПАУЗА  

Теперь будет получен следующий результат.

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

  @ эхо ВЫКЛ.

:: Если var не определен SET var = hello
ЕСЛИ "% var%" == "" (SET var = Hello)

:: Это можно сделать и таким образом
ЕСЛИ НЕ ОПРЕДЕЛЕН var (SET var = Hello)
  

В любом случае он установит var на 'Hello' , поскольку он не определен ранее.

Пакетный файл, если еще пример, чтобы проверить, существует ли файл или папка

EXIST Команда используется для проверки, существует файл или нет.Прочтите эту статью, чтобы узнать подробности о EXIST и всех других командах командных файлов.

  @ эхо ВЫКЛ.

:: Команда EXIST используется для проверки существования
ЕСЛИ СУЩЕСТВУЕТ D: \ abc.txt, найден ECHO abc.txt
ЕСЛИ СУЩЕСТВУЕТ D: \ xyz.txt (ECHO xyz.txt найден) ELSE (ECHO xyz.txt не найден)

ПАУЗА  

Теперь предположим, что у нас есть «abc.txt», на диске D и «xyz.txt» не существует в D :, тогда он сгенерирует следующий вывод.

Итак, это все о операторах if else для командного файла.Мы надеемся, что вам не составило труда узнать об этом, и надеемся, что к этому времени вы будете знать, как использовать или в сценариях пакетных файлов.



если | Документы Microsoft

  • 3 минуты на чтение

В этой статье

Выполняет условную обработку в пакетных программах.

Синтаксис

  если [не] УРОВЕНЬ ОШИБКИ <число> <команда> [еще <выражение>]
if [not]  ==   [else ]
если [не] существует <имя файла> <команда> [еще <выражение>]
  

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

  if [/ i]     [else ]
if cmdextversion <число> <команда> [еще <выражение>]
если определено <переменная> <команда> [иначе <выражение>]
  

Параметры

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

  • Когда программа останавливается, она возвращает код выхода.Чтобы использовать коды выхода в качестве условий, используйте параметр errorlevel .

  • Если вы используете , определенный , в среду добавляются следующие три переменные: % errorlevel% , % cmdcmdline% и % cmdextversion% .

    • % errorlevel% : заменяется на строковое представление текущего значения переменной среды ERRORLEVEL. Эта переменная предполагает, что еще не существует переменной среды с именем ERRORLEVEL.Если есть, вместо этого вы получите это значение ERRORLEVEL.

    • % cmdcmdline% : заменяется исходной командной строкой, которая была передана в Cmd.exe до любой обработки Cmd.exe. Это предполагает, что еще не существует переменной среды с именем CMDCMDLINE. Если есть, вместо этого вы получите это значение CMDCMDLINE.

    • % cmdextversion% : заменяется на строковое представление текущего значения cmdextversion .Это предполагает, что еще не существует переменной среды с именем CMDEXTVERSION. Если есть, вместо этого вы получите это значение CMDEXTVERSION.

  • Вы должны использовать предложение else в той же строке, что и команда после , если .

Примеры

Чтобы отобразить сообщение Не удается найти файл данных, если файл Product.dat не может быть найден , введите:

  если товар не существует.dat echo Не удается найти файл данных
  

Чтобы отформатировать диск в дисководе A и отобразить сообщение об ошибке в случае возникновения ошибки во время процесса форматирования, введите следующие строки в командном файле:

 : начало
@ эхо выключено
формат a: / s
если нет errorlevel 1 goto end
echo Произошла ошибка во время форматирования.
:конец
echo Конец пакетной программы.
  

Чтобы удалить файл Product.dat из текущего каталога или отобразить сообщение, если Product.dat не найден, введите следующие строки в пакетном файле:

  ЕСЛИ СУЩЕСТВУЕТ Продукт.dat (
del Product.dat
) ЕЩЕ (
echo Файл Product.dat отсутствует.
)
  

Примечание

Эти строки можно объединить в одну строку следующим образом:

  ЕСЛИ СУЩЕСТВУЕТ Product.dat (del Product.dat) ELSE (echo Файл Product.dat отсутствует.)
  

Чтобы отобразить значение переменной среды ERRORLEVEL после запуска пакетного файла, введите в пакетном файле следующие строки:

  перейти к ответу% errorlevel%
: answer1
echo Программа вернула ошибку уровня 1
перейти к концу
: answer0
echo Программа вернула уровень ошибки 0
перейти к концу
:конец
эхо Готово!
  

Чтобы перейти к метке ОК, если значение переменной среды ERRORLEVEL меньше или равно 1, введите:

  если% errorlevel% LEQ 1 перейти в норму
  

Дополнительные ссылки

5 операторов IF для использования в более умных пакетных сценариях Windows

Если вы много работаете с пакетными файлами Windows, оператор IF предлагает очень мощный способ добавить гибкости вашим сценариям.

В этой статье вы узнаете о пяти основных типах операторов IF, которые можно использовать в пакетном файле Windows, о том, как выглядит правильный синтаксис, и о реалистичных примерах для каждого из них.

Если вы готовы приступить к написанию сценариев, приступим!

1. Сравните значения

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

Например, предположим, что вы хотите написать пакетный сценарий, который ежедневно проверяет размер жесткого диска вашего компьютера. Если он меньше 3 ГБ, вы хотите получить по электронной почте отчет «Слишком мало места на жестком диске».

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

  @echo off 
set DriveLimit = 300000000
for / f "usebackq delims == tokens = 2" %% x in (`wmic logicdisk, где" DeviceID = 'C:' "get FreeSpace / format: value`) do set FreeSpace = %% x
Echo FreeSpace = "% FreeSpace%"
Echo Limit = "% DriveLimit%"
Если% FreeSpace% GTR% DriveLimit% (
Echo Достаточно свободного места.
) else (
Echo Недостаточно свободного места.
)

WMIC - это компонент Windows Management Instrumentation в Windows, который поставляется с набором команд, которые можно использовать для получения информации о ПК. Вот так команда «wmic» в этом скрипте вызывает пространство «логический диск» и помещает его в переменную FreeSpace. Теперь вы можете просто заменить строку «Echo: недостаточно свободного места» на команду blat email, чтобы отправить вам предупреждение.

Наконец, настройте этот сценарий как запланированное пакетное задание Windows, которое запускается ежедневно.

Если вы никогда раньше не использовали blat, у нас есть статья, в которой показано, как настроить blat. Незнакомы с настройкой запланированных заданий? Мы подготовили для вас статью о том, как настроить запланированные задачи Windows.

2. Сравнение строк

Еще одно ценное сравнение IF, которое вы можете выполнить в пакетном задании, - это , сравнивая строки .

В следующем примере вы увидите, как проверить версию Windows с помощью пакетного задания.Затем вы можете сравнить это с ожидаемой версией Windows.

Некоторые варианты использования этого сценария могут быть использованы для ИТ-аудита, когда вам нужно быстро запустить сценарий и убедиться, что текущая операционная система является самой последней или требует обновления.

Вот как выглядит этот сценарий.

  @echo off 
for / f "tokens = 4-5 delims =." %% i in ('ver') установить VERSION = %% i. %% j
if "% version%" == "6.0 "эхо Windows Vista.
if "% version%" == "6.1" echo Windows 7
if "% version%" == "6.2" echo Windows 8
if "% version%" == "6.3" echo Windows 8.1
if "% version % "==" 10.0 "echo Windows 10.

Вот как выглядит результат этого скрипта.

Возможность сравнивать строки в пакетном режиме открывает целый список возможностей. Если вы изучите всю информацию, которую можно получить с помощью команды WMIC, вы увидите, сколько статистических данных о вашем компьютере вы можете отслеживать.Вы можете использовать запланированные пакетные задания, чтобы предупреждать об этом.

3. Проверьте, существует ли файл

Другая полезная ситуация, когда оператор IF в пакетном файле - это для проверки существования файла данных .

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

Затем пакетное задание может либо скопировать этот файл в другое место, где он может быть обработан, либо запустить какой-либо сценарий Windows, который обрабатывает файл и выводит файл Excel.

(Раньше мы писали о том, как использовать сценарии Windows для обработки данных в файл Excel; неплохо почитать.)

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

  @echo off 
если существует c: \ temp \ datafile.txt (
% WINDIR% \ SysWOW64 \ cmd.exe
cscript LoadToExcel.vbs
) else (
rem файл не существует
)

Сравнение IF EXISTS полезно для многих вещей.

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

4. Проверьте, не выполнена ли команда

Один из аспектов сценариев пакетных файлов, который используют слишком немногие ИТ-специалисты или программисты, - это проверка на наличие ошибок .

Существует множество пакетных заданий, которые выполняют важные ИТ-задачи, такие как резервное копирование важных файлов или выполнение операций копирования файлов.Когда эти пакетные задания терпят неудачу, системы выходят из строя, и люди это замечают.

Гораздо разумнее получить предупреждение, когда ваше пакетное задание не удалось выполнить команду , прежде чем человек начнут это замечать. Таким образом, вы можете заранее решить проблему.

Вы можете сделать это, используя переменную% errorlevel%, которую большинство приложений и команд возвращают после запуска.

Все, что вам нужно сделать, это выполнить команду IF% ERRORLEVEL%.Если приложение или команда вернули ноль, все в порядке. Если нет, то вам нужно отправить себе электронное письмо.

  @echo off 
xcopy C:
omefolder E: \ backupfolder
IF% ERRORLEVEL% NEQ 0 <команда blat для отправки электронной почты>

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

Если вы предпочитаете использовать оператор IF для проверки конкретных кодов ошибок, Windows предлагает довольно обширный список кодов ошибок.

5. Проверьте отсутствие параметров

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

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

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

Вот как это выглядит.

  @echo off 
IF [% 1] == [] (
GOTO sub_message
) ELSE (
xcopy% 1 E: \ backupfolder
)
GOTO eof
: sub_message
echo Вы забыли указать свой путь.
: eof

Если вы никогда раньше не использовали параметры в пакетных сценариях, символ процента, за которым следует число, представляет переменную параметра. % 1 - первый параметр,% 2 - второй и так далее.

Пакетные задания могут быть эффективными

Многие люди начинают использовать пакетные задания для простых задач, которые необходимо выполнять последовательно. С помощью операторов IF можно сделать ваши сценарии более интеллектуальными.

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

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

20 удивительных скидок, которые вы можете получить с бесплатным адресом электронной почты EDU

An.Электронный адрес EDU из школы или колледжа может обеспечить доступ ко многим преимуществам. Вот наши лучшие студенческие скидки на электронную почту!

Читать далее

Об авторе Райан Дьюб (Опубликовано 942 статей)

Райан имеет степень бакалавра электротехники.Он проработал 13 лет в области автоматизации, 5 лет в ИТ, а теперь работает инженером по приложениям. Бывший управляющий редактор MakeUseOf, он выступал на национальных конференциях по визуализации данных и выступал на национальном телевидении и радио.

Более От Райана Дьюба
Подпишитесь на нашу рассылку новостей

Подпишитесь на нашу рассылку, чтобы получать технические советы, обзоры, бесплатные электронные книги и эксклюзивные предложения!

Нажмите здесь, чтобы подписаться

If - выполнить команду условно - Windows CMD

If - выполнить команду условно - CMD Windows - SS64.ком

Условно выполнить команду.

  Синтаксис файла 
   ЕСЛИ [НЕ] СУЩЕСТВУЕТ  имя файла команда 

   ЕСЛИ [НЕ] СУЩЕСТВУЕТ  имя файла  ( команда ) Иначе ( команда )

  Синтаксис строки 
   IF [/ I] [NOT]   item1   ==   item2    команда 
   IF [/ I] [NOT] «  item1  »     == «  item2  »  команда 

   IF [/ I]   item1    compare-op    item2    команда 

   IF [/ I]   item1    compare-op    item2   ( команда ) ELSE ( команда )

  Синтаксис проверки ошибок 
   ЕСЛИ [НЕ] ОПРЕДЕЛЕНА  переменная команда 

   ЕСЛИ [НЕ] ОШИБКА  номер команды 

   IF CMDEXTVERSION  номер команды 

  ключ 
     item  Текстовая строка или переменная среды для более сложных
               сравнений, переменная может быть изменена с помощью
               синтаксис подстроки или поиска. команда  Команда для выполнения.

     имя_файла  Файл для тестирования или шаблон подстановки.

   НЕ выполнять команду, если условие ложно.

     ==  Выполните команду, если две строки равны.

   / I Делаю сравнение строк нечувствительным к регистру.

     compare-op  может быть одним из
                EQU: равный
                NEQ: не равно

                LSS: менее <
                LEQ: меньше или равно <=

                GTR: Больше чем>
                GEQ: больше или равно> =

                Этот трехзначный синтаксис необходим, потому что символы> и <
                символы распознаются как операторы перенаправления 

IF будет анализировать числа только при использовании одного из (EQU, NEQ, LSS, LEQ, GTR, GEQ).
Оператор сравнения == всегда приводит к сравнению строк.

УРОВЕНЬ ОШИБКИ

Существует два разных метода проверки уровня ошибки, первый синтаксис (IF ERRORLEVEL ...) обеспечивает совместимость с древними пакетными файлами времен Windows 95.
Второй способ - использовать переменную% ERRORLEVEL%, доступную в Windows 2000 или новее.

IF ERRORLEVEL n следует читать как IF Errorlevel > = number
я.е.
IF ERRORLEVEL 0 вернет TRUE независимо от того, является ли уровень ошибки 0, 1 или 5 или 64
IF ERRORLEVEL 1 вернет TRUE независимо от того, равен ли уровень ошибки 1 или 5 или 64
IF NOT ERRORLEVEL 1 означает, что ERRORLEVEL меньше 1 (ноль или отрицательный ).
Это не очень удобно для чтения и использования и не позволяет легко учесть отрицательные числа ошибок.

Использование переменной% ERRORLEVEL% является более логичным методом проверки уровней ошибок:

IF% ERRORLEVEL% NEQ 0 Эхо Обнаружена ошибка
IF% ERRORLEVEL% EQU 0 Echo Ошибка обнаружена

IF% ERRORLEVEL% EQU 0 (Echo Ошибка обнаружена) ELSE (Echo Ошибка обнаружена)
IF% ERRORLEVEL% EQU 0 Echo Ошибка не обнаружена || Эхо Обнаружена ошибка

Это позволяет вам перехватывать ошибки, которые могут быть отрицательными числами, вы также можете проверить на наличие конкретных ошибок:
IF% ERRORLEVEL% EQU 64...

Чтобы намеренно повысить уровень ОШИБКИ в пакетном сценарии, используйте команду EXIT / B.

Возможно (хотя и не очень хорошая идея) создать строковую переменную с именем% ERRORLEVEL% (пользовательская переменная)
если такая переменная присутствует, она переопределит и предотвратит чтение системной переменной% ERRORLEVEL% такими командами, как ECHO и IF.

Проверить, пуста ли переменная

Чтобы проверить наличие параметра командной строки, используйте пустые скобки, например:

IF [% 1] == [] ECHO Value Missing
или
IF [% 1] EQU [] ECHO Value Missing

При сравнении с переменной, которая может быть пустой, мы включаем пару скобок [], чтобы, если переменная действительно пуста, команде IF все равно есть что сравнить: IF [] EQU [] вернет True.

Фактически, вы можете использовать для этого почти любой символ: '~', фигурные скобки, {} или даже число 4, но квадратные скобки, как правило, выбираются, потому что они не имеют особого значения.
При работе с именами файлов / путями вы всегда должны заключать их в кавычки, если% _myvar% содержит "C: \ Some Path", тогда ваше сравнение будет IF ["C: \ Some Path"] EQU []
если% _myvar% может содержать пустые кавычки, "" тогда ваше сравнение должно быть IF [% _myvar%] EQU [""]

, если% _myvar% не будет никогда содержать кавычки, тогда вы можете использовать кавычки вместо скобок ЕСЛИ "% _myvar%" EQU ""
Однако с этим шаблоном, если% _myvar% неожиданно содержит кавычки, вы получите IF "" C: \ Some Path "" EQU "" эти удвоенные кавычки, хотя официально это не задокументировано, так как escape все равно испортит сравнение.

Проверить, является ли переменная NULL

В случае переменной, которая может быть NULL - пустая переменная полностью удалит определение переменной, поэтому проверка на NULL станет:

IF NOT DEFINED _example ECHO Value Missing

IF DEFINED вернет true, если переменная содержит любое значение (даже если это просто пробел)

Чтобы проверить наличие пользовательской переменной, используйте SET VariableName или IF DEFINED VariableName

Проверить наличие файлов и папок

ЕСЛИ СУЩЕСТВУЕТ имя_файла Обнаруживает существование файла или папки.

Сценарий empty.cmd покажет, пуста папка или нет (регистр не учитывается).

Круглая скобка

Круглые скобки можно использовать для разделения команд на несколько строк. Это позволяет писать более сложные команды IF… ELSE…:

 ЕСЛИ СУЩЕСТВУЕТ filename.txt  (
    Эхо при удалении filename.txt
    Del filename.txt
  )  ELSE  (
    Echo Файл не найден.)  

При объединении оператора ELSE в круглые скобки всегда помещайте открывающую скобку в ту же строку, что и ELSE.
) ELSE ( Это связано с тем, что CMD выполняет довольно примитивный синтаксический анализ команды по одной строке за раз.

При использовании круглых скобок оболочка CMD будет расширять [читать] все переменные в начале блока кода и использовать эти значения, даже если значение переменных только что было изменено. Включение DelayedExpansion заставит оболочку читать переменные в начале каждой строки.

Трубы

При передаче команд по конвейеру выражение вычисляется слева направо, поэтому

IF SomeCondition Command1 | Command2 эквивалентно:

(IF SomeCondition Command1 ) | Команда2
Канал создается всегда, и всегда выполняется команда Command2 , независимо от того, является ли SomeCondition ИСТИНА или ЛОЖЬ

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

IF SomeCondition ( Command1 | Command2 )
Если условие выполнено, будет запущена команда Command1, а ее выходные данные будут переданы команде Command2.

Команда IF интерпретирует скобки вокруг условия как еще один символ для сравнения (например, # или @), например:
IF (% _var1% == ( demo Echo переменная _var1 содержит текст демо

Размещение команды IF с правой стороны канала также возможно, но оболочка CMD содержит ошибки в этой области и может проглотить один из символов-разделителей, что приведет к неожиданным результатам.
Простой пример, который действительно работает:

Echo Y | ЕСЛИ красный == синий del *.журнал

Объединение команд IF (И).

Единственный логический оператор, напрямую поддерживаемый IF, - это NOT, поэтому для выполнения AND требуется объединение нескольких операторов IF:

 IF  SomeCondition  (
   IF  SomeOtherCondition  (
       Command_if_both_are_true 
   )
) 

Если выполняется одно из условий (ИЛИ)

Это можно проверить с помощью временной переменной:

Установить "_tempvar ="
Если SomeCondition Установить "_tempvar = 1"
Если SomeOtherCondition Установить "_tempvar = 1"
если% _tempvar% EQU 1 Command_to_run_if_either_is_true

Разделители

Если строка, сравниваемая командой IF, включает разделители, такие как [Пробел] или [Запятая], то либо разделители должны быть экранированы с помощью символа вставки ^, либо вся строка должна быть "заключена в кавычки".
Это сделано для того, чтобы оператор IF рассматривал строку как отдельный элемент, а не как несколько отдельных строк.

Тест Числовые значения

IF анализирует только номеров , когда используется один из операторов сравнения (EQU, NEQ, LSS, LEQ, GTR, GEQ).
Оператор сравнения == всегда приводит к сравнению строк и .

Это важное различие, потому что если вы сравниваете числа как строки, это может привести к неожиданным результатам: «2» будет больше, чем «19», а «026» будет меньше «10».

Правильное числовое сравнение:
IF 2 GEQ 15 эхо "больше"

Использование скобок или кавычек вызовет сравнение строк:
IF (2) GEQ (15) echo "больше"
IF "2" GEQ "15" echo "больше"

Это поведение прямо противоположно команде SET / a, где требуются кавычки.

IF должен работать в полном диапазоне 32-битных целых чисел со знаком (от -2 147 483 648 до 2 147 483 647)

C: \> if 2147483646 GEQ 2147483647 (Echo Larger) Else (Echo Smaller)
Меньший ⇨ правильный

C: \> if 2147483647 GEQ 2147483648 (Echo Larger) Else (Echo Smaller)
Больше ⇨ неверно из-за переполнения

C: \> if -2147483649 GEQ -2147483648 (Echo Larger) Else (Echo Smaller)
Больше ⇨ неверно из-за переполнения

Вы можете выполнить сравнение строк для очень длинных чисел, но это будет работать должным образом, только если числа имеют одинаковую длину:

C: \> if "2147483647" GEQ "2147483648" (Echo Larger) Else (Echo Smaller)
Меньший ⇨ правильный

Подстановочные знаки

Подстановочные знаки не поддерживаются IF, поэтому% COMPUTERNAME% == SS6 * не будет соответствовать SS64

Обходной путь - получить подстроку и сравнить только эти символы:
SET _prefix =% COMPUTERNAME: ~ 0,3%
IF% _prefix% == SS6 GOTO they_matched

Если расширения команд отключены, ЕСЛИ будет поддерживать только прямые сравнения: ЕСЛИ ==, ЕСЛИ СУЩЕСТВУЕТ, ЕСЛИ ОШИБКА
также будет отключена системная переменная CMDEXTVERSION.

IF сам по себе не устанавливает и не сбрасывает уровень ошибки.

Примеры:

ЕСЛИ СУЩЕСТВУЕТ C: \ logs \ *. Log (файл журнала эхо-сигналов существует)

ЕСЛИ СУЩЕСТВУЕТ C: \ logs \ install.log (Echo Complete) ELSE (Echo failed)

ЕСЛИ ОПРЕДЕЛЕН _department ECHO Получил переменную _department

ЕСЛИ ОПРЕДЕЛЕН _commission SET / A "_salary =% _ salary% +% _commission%"

ЕСЛИ CMDEXTVERSION 1 GOTO start_process

IF% ERRORLEVEL% EQU 2 goto sub_problem2 

IF - это внутренняя команда.

Вы видите вещи; и вы говорите "Почему?" Но я мечтаю о вещах, которых никогда не было; и я говорю "почему бы и нет?" ~ Джордж Бернард Шоу

Связанные команды:

Использование скобок для группировки и раскрытия выражений.
Синтаксис условного выполнения (И / ИЛИ)
SET - отображение или изменение переменных среды.
ECHO - Отображение сообщения на экране.
ВЫХОД - Установить конкретный УРОВЕНЬ ОШИБКИ.
IFMEMBER - член группы (Ресурсный комплект).
SC - Служба работает (набор ресурсов).
Эквивалент PowerShell: if - условное выполнение команды.
Эквивалентная команда bash (Linux): if - Условно выполнить команду.


Авторские права © 1999-2021 SS64.com
Некоторые права защищены

Использование нескольких операторов IF в пакетном файле

Есть ли особые правила, которым необходимо следовать?

Не существует «стандартного» способа создания командных файлов, потому что подавляющее большинство их авторов и сопровождающих либо не понимают концепций программирования, либо думают, что они неприменимы к командным файлам.

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

Существуют некоторые стандарты кодирования, которые гласят: Если вы пишете оператор if , вы должны использовать фигурные скобки, даже если у вас нет предложения else . Это избавляет вас от тонких, трудно поддающихся отладке проблем и однозначно читается.Я не вижу причин, по которым вы не могли бы применить это рассуждение к пакетным файлам.

Давайте посмотрим на ваш код.

  ЕСЛИ СУЩЕСТВУЕТ somefile.txt ЕСЛИ СУЩЕСТВУЕТ someotherfile.txt SET var = somefile.txt, someotherfile.txt
  

И синтаксис IF из команды HELP IF :

  IF [NOT] ERRORLEVEL числовая команда
IF [НЕ] строка1 == строка2 команда
IF [NOT] EXISTS имя файла команда

...

ЕСЛИ СУЩЕСТВУЕТ имя файла (
  команда
) ЕЩЕ (
  другая команда
)
  

Итак, вы связываете IF как команды.

Если вы используете правило общего стандарта кодирования, о котором я упоминал выше, вам всегда нужно использовать скобки. Вот как вы это сделаете для своего примера кода:

  ЕСЛИ СУЩЕСТВУЕТ "somefile.txt" (
  ЕСЛИ СУЩЕСТВУЕТ "someotherfile.txt" (
    SET var = "somefile.txt, someotherfile.txt"
  )
)
  

Убедитесь, что вы правильно форматируете и делаете отступы. Вы делаете это в коде, и вы должны делать это в своих пакетных скриптах.

Кроме того, вы должны иметь привычку всегда цитировать имена файлов и правильно цитировать.В разделе HELP FOR и HELP SET есть словоблудие, которое поможет вам удалить лишние кавычки при повторном цитировании строк.

Редактировать

Судя по вашим комментариям и перечитыванию исходного вопроса, кажется, что вы хотите создать список существующих файлов, разделенных запятыми. В этом случае вы можете просто использовать набор операторов , если /, иначе , но это приведет к кучу дублированной логики и не будет совсем чистым, если у вас будет более двух файлов.

Лучше написать подпрограмму, которая проверяет существование отдельного файла и добавляет к переменной, если указанный файл существует. Затем просто вызовите эту подпрограмму для каждого файла, который вы хотите проверить:

  @ECHO ВЫКЛ.
SETLOCAL

REM Todo: установите здесь глобальные переменные скрипта
ЗВОНИТЕ: MainScript
GOTO: EOF

REM MainScript ()
: MainScript
  SETLOCAL

  ЗВОНИТЕ: AddIfExists "somefile.txt" "% files%" "files"
  ЗВОНИТЕ: AddIfExists "someotherfile.txt" "% files%" "files"

  ECHO.Files:% files%

  ENDLOCAL
GOTO: EOF

REM AddIfExists (имя файла, существующие имена файлов, returnVariableName)
: AddIfExists
  SETLOCAL

  ЕСЛИ СУЩЕСТВУЕТ "% ~ 1" (
    УСТАНОВИТЬ "результат =% ~ 1"
  ) ЕЩЕ (
    УСТАНОВИТЬ "результат ="
  )

  (
    REM Очистка и возврат результата - при необходимости объедините
    ENDLOCAL

    ЕСЛИ "% ~ 2" == "" (
      УСТАНОВИТЬ "% ~ 3 =% результат%"
    ) ЕЩЕ (
      УСТАНОВИТЬ "% ~ 3 =% ~ 2,% результат%"
    )
  )
GOTO: EOF
  

IF... ИЛИ ЕСЛИ ... в пакетном файле Windows

Решение zmbq хорошее, но не может использоваться во всех ситуациях, например, внутри блока кода, такого как цикл FOR DO (...).

Альтернативой является использование индикаторной переменной. Инициализируйте его как неопределенное, а затем определите его, только если любое из условий ИЛИ истинно. Затем используйте IF DEFINED в качестве финального теста - нет необходимости использовать отложенное расширение.

  ДЛЯ ..... DO (
  установить "ИСТИНА ="
  ЕСЛИ cond1 устанавливает ИСТИНА = 1
  ЕСЛИ cond2 устанавливает ИСТИНА = 1
  ЕСЛИ определено ИСТИНА (
    ...
  ) еще (
    ...
  )
)
  

Вы можете добавить логику ELSE IF, которую использует arasmussen, на том основании, что она может работать немного быстрее, если 1-е условие истинно, но я никогда не беспокоюсь.

Приложение - Это повторяющийся вопрос с почти идентичными ответами на Использование ИЛИ в операторе IF Пакетный сценарий WinXP

Final addendum - Я почти забыл свой любимый метод проверки, является ли переменная одним из списков нечувствительных к регистру значений.Инициализируйте тестовую переменную, содержащую список допустимых значений с разделителями, а затем используйте поиск и замену, чтобы проверить, находится ли ваша переменная в списке. Это очень быстро и требует минимального кода для произвольно длинного списка. Это требует отложенного расширения (или трюка CALL %% VAR %%). Также тест НЕ ЧУВСТВИТЕЛЬНЫЙ.

  установить «ТЕСТ =; значение1; значение2; значение3; значение4; значение5;»
if "! TEST:;% VAR%; =!" neq "! ТЕСТ!" (эхо истина) еще (эхо ложь)
  

Вышеупомянутое может завершиться ошибкой, если VAR содержит = , поэтому тест не является надежным.

При выполнении теста в блоке, где требуется отложенное расширение для доступа к текущему значению VAR, тогда

  для ... do (
  установить "ТЕСТ =; значение1; значение2; значение3; значение4; значение5;"
  for / f %% A in (";! VAR !;") выполнить, если "! TEST: %% A =!" neq "! ТЕСТ!" (эхо истина) еще (эхо ложь)
)
  

FOR такие параметры, как "delims =", могут потребоваться в зависимости от ожидаемых значений в VAR

Вышеупомянутую стратегию можно сделать надежной даже с = в VAR, добавив немного большего количества кода.

  установить «ТЕСТ =; значение1; значение2; значение3; значение4; значение5;»
if "! TEST:;% VAR%; =!" neq "! ТЕСТ!" if "! TEST:;% VAR%; =;% VAR%;" == "! TEST!" эхо верно
  

Но теперь мы потеряли возможность предоставлять предложение ELSE, если мы не добавим индикаторную переменную. Код начал выглядеть немного «некрасиво», но я думаю, что это наиболее эффективный и надежный метод проверки, является ли VAR одним из произвольного числа вариантов без учета регистра.

Наконец, есть более простая версия, которая, на мой взгляд, немного медленнее, потому что она должна выполнять один IF для каждого значения., и и т. Д. Еще одно ограничение этого решения заключается в том, что оно не предоставляет возможности для предложения ELSE, если вы не добавите индикаторную переменную. Преимущества заключаются в том, что он может быть чувствительным к регистру или нечувствительным в зависимости от наличия или отсутствия опции IF / I .

более мощных пакетных файлов - ветвление с помощью операторов if

Обсуждаются команды «If ... else» и «goto».

Хотя многие полезные задачи могут быть выполнены с помощью простых командных файлов, содержащих всего несколько строк, полную доступную мощность можно реализовать только с помощью более продвинутых методов ветвления, итерации и цикла.Эти методы входят в число инструментов, используемых программистами для создания очень сложных сценариев. Тем не менее, концепции на самом деле довольно легко понять и доступны тем, кто не имеет опыта программирования. Всего несколько дополнительных строк в пакетном файле с использованием этих инструментов может значительно повысить универсальность и мощность. На этой странице я расскажу о ветвлении. Во второй части, посвященной более сложным методам, я представлю итерационные методы.

Условный переход с помощью операторов If

Пакетные файлы могут принимать решения и выбирать действия в зависимости от условий.В действиях этого типа используется инструкция, начинающаяся с «If». Основное значение оператора «Если» - Если что-то верно, выполните действие (в противном случае выполните другое действие). Вторая часть оператора (в скобках) является необязательной. В противном случае система просто переходит к следующей строке в пакетном файле, если первое условие не выполняется. Фактический синтаксис: If (условие) (command1) Else (command2) Часть «Else» является необязательной. Форма «Если нет» также может использоваться для проверки того, ложно ли условие.Обратите внимание, что «Если» проверяет истинность или ложь в логическом смысле.

Оператор «Если существует»

Существует специальный оператор «Если существует», который можно использовать для проверки существования файла, за которым следует команда. Примером может быть: Если существует somefile.ext del somefile.ext Вы также можете использовать отрицательный тест существования: если не существует somefile.ext echo no file

Оператор «Если определено»

Другой особый случай - « если определено », который используется для проверки существования переменной.Например: если определено некоторая переменная некоторая команда Это также может использоваться в отрицательной форме, «если не определено».

Оператор «If errorlevel»

Еще один особый случай - «if errorlevel», который используется для проверки кодов выхода последней выполненной команды. Различные команды выдают целочисленные коды выхода для обозначения статуса команды. Обычно команды передают 0, если команда была выполнена успешно, и 1, если команда не выполнена. Некоторые команды могут передавать дополнительные значения кода.Например, для Xcopy существует пять значений кода выхода. Эти значения кода выхода хранятся в специальной переменной errorlevel . Примером команды может быть: if errorlevel n somecommand , где «n» - один из целочисленных кодов выхода. Обратите внимание, что сравнение выполняется путем проверки того, что errorlevel больше или равен n . Если используется с "not", сравнение проверяет, меньше ли errorlevel , чем n .

Оператор Значение
EQU равно
NEQ не равно
LSS менее
LEQ меньше или равно
GTR больше
GEQ больше или равно

Операторы сравнения

В некоторых случаях условие, которое должно быть выполнено, получается путем сравнения строк.Например, , если строка1 == строка2 Обратите внимание, что знак «равно» написан дважды. Это условие выполняется, если две строки абсолютно идентичны, включая регистр. Чтобы сделать сравнения нечувствительными к регистру, используйте переключатель «/ i». Для более общих сравнений используйте операторы из Таблицы I. (Операторы в таблице указаны в верхнем регистре, но они не зависят от регистра). Числовые сравнения работают только со строками, состоящими из целых цифр. В противном случае сравнение выполняется в алфавитном порядке. Например, «а» меньше «б».Для независимости от регистра используйте переключатель «/ i». Пример команды может выглядеть так: if / i string1 gtr string2 somecommand

При сравнении переменных, которые являются строками, лучше всего заключить имя переменной в кавычки. Например, используйте: , если "% 1" == somestring somecommand

Команда "goto"

Как правило, выполнение командного файла происходит построчно, при этом команды в каждой строке выполняются по очереди. Однако часто бывает желательно выполнить определенный раздел командного файла, пропуская другие части.Возможность перехода к определенному разделу обеспечивается командой "goto" с соответствующим названием (записанной одним словом). Целевой раздел помечается строкой в ​​начале, имя которой начинается с двоеточия. Таким образом, сценарий выглядит как ...
goto: label
... некоторые команды
: label
... некоторые другие команды
Выполнение пропустит «некоторые команды» и начнется с «некоторых других команд» . Метка может быть строкой в ​​любом месте сценария, в том числе перед командой "goto".

Команды «Goto» часто встречаются в операторах «if». Например, у вас может быть команда типа: if (condition) goto: label

Метка «Конец файла» (: eof) для выхода из сценария

Иногда желательно завершить сценарий, если условие выполняется (или не выполняется). Один из способов выхода - использовать специальную метку : eof в команде goto . Этикетка фактически не помещается в пакетный файл. Windows XP и более поздние версии распознают : eof без какой-либо метки, явно помещенной в конец командного файла.Таким образом, если вам нужно проверить конкретное условие, которое делает завершение сценария желательным, вы можете написать: if (condition) goto: eof Обратите внимание, что это завершает сценарий, но не обязательно закрывает командную оболочку.

Цикл с «Если» и «Перейти»

Древний метод выполнения повторяющихся задач использует счетчик, операторы «if» и команду «goto». Счетчик определяет, сколько раз задача повторяется, оператор «if» определяет, когда было достигнуто желаемое количество повторений, а команда «goto» позволяет выполнить соответствующее действие, будь то повторяющаяся задача или выход.Как правило, предпочтительны более элегантные методы, предоставляемые мощной командой «for ... in ... do», и они обсуждаются на следующей странице. Однако для полноты и для иллюстрации части того, что мы обсуждали, я приведу пример, в котором используется более неуклюжий метод.

Приведенный ниже простой сценарий создает числа от 1 до 99 и отправляет их в файл. Он использует команду «set» для создания переменной, которая также является счетчиком того, сколько раз мы выполняли итерацию. @echo off
set / a counter = 0
: numbers
set / a counter =% counter% + 1
if% counter% == 100 (goto: eof) else (echo% counter% >> E: \ count .txt)
goto: numbers
(Лучшая практика программирования требует, чтобы переменная % counter% была локализована или уничтожена в конце, но для простоты я пропустил несколько дополнительных строк, необходимых для этого. Как написано, эта переменная среды будет сохраняются до тех пор, пока не будет закрыта сама командная оболочка, а не только сценарий.) следующая страница: @echo off
for / l %% X in (1,1,99) do (echo %% X >> E: \ count.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *