Содержание
Бывает, что при написании командного файла (пакетного файла, 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 /?.
Помощь приводится на языке установленной операционной системы.
Вывод
Текущий каталог
Параметры вызова сценариев
Например, после вызова будем иметь следующую картину:
Параметр | Значение |
---|---|
%0 | d:deltalngscompile_all.cmd |
%1 | sol.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%.
Использование нескольких команд и символов условной обработки
Можно выполнять несколько команд из одной командной строчки с помощью символов условной обработки, перечисленных в следующей таблице.
Символ | Синтаксис | Определение |
---|---|---|
& [. ] | команда1 & команда2 | Выполняется первая команда, затем вторая команда. |
&& [. ] | команда1 && команда2 | Вторая команда выполняется, только если первая была выполнена успешно. |
|| [. ] | команда1 || команда2 | Вторая команда выполняется, только если первая не была выполнена (полученный код ошибки превышает ноль). |
( ) [. ] | ( команда1 & команда2 ) | Используется для группировки или вложения команд. |
; или , | команда1 параметр1 ; параметр2 | Используется для разделения параметров команды. |
Примечание:
Амперсанд &, вертикальная черта | и скобки () являются специальными символами, которым должен предшествовать управляющий символ ^ или кавычки, если эти символы передаются в качестве аргументов.
Вот пример специализированного скрипта для сравнения файлов:
Использование переменных среды
Глобальные переменные устанавливаются в свойствах операционной системы или специальной внешней утилитой setx и доступны с одними и теми же значениями при запуске всех пакетных файлов.
Локальные переменные устанавливаются и используются по-своему в каждом отдельном сценарии, сохраняются только во время его выполнения, а также передаются в дочерние сценарии при вложенных вызовах.
Псевдопеременные, такие как %CD%, %DATE%, %TIME%, %RANDOM%, %ERRORLEVEL%, обрабатываются особенным образом в зависимости от определенных условий.
В следующей таблице приведен выборочный список наиболее интересных переменных среды.
Переменная | Тип | Описание |
---|---|---|
Локальная | Возвращает путь к текущей папке. | |
Системная | Возвращает имя компьютера. | |
Системная | Возвращает текущую дату. Использует тот же формат, что и команда date /t . | |
Системная | Возвращает код ошибки последней использовавшейся команды. | |
Системная | Указывает путь поиска для исполняемых файлов. | |
Системная | Возвращает произвольное десятичное число от 0 до 32767. | |
Системная | Возвращает размещение системного каталога Windows. | |
и | Системная и пользовательская | Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP. |
Системная | Возвращает текущее время. Использует тот же формат, что и команда time /t . | Локальная | Возвращает имя пользователя, выполнившего вход в систему. |
При использовании переменных можно также использовать выделение подстрок.
Конструкция | Назначение |
---|---|
%PATH: |
10,5%
-10%
0,-2%
Для установки значений переменных используется команда set.
Установка значений:
set переменная=значение
Показ значений:
set переменная
Показ значений всех переменных:
set (без параметров)
Проверка наличия переменной с заданным именем:
if defined переменная команда
Вычисление арифметических выражений
В следующей таблице представлены арифметические операторы, поддерживающие параметр /a , в порядке убывания приоритета.
Оператор | Действие оператора |
---|---|
() | группировка |
! |
—
При использовании символов & | % ^ заключайте выражение в кавычки.
Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразуются в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.
Пример использования вычисления выражений:
Потоки ввода/вывода
Потоки используются в командных сценариях для унифицированного распределения и перенаправления ввода/вывода.
В следующей таблице представлены стандартные потоки.
Поток | Номер дескриптора | Описание |
---|---|---|
STDIN | Стандартный ввод (только чтение) | |
STDOUT | 1 | Стандартный вывод (только запись) |
STDERR | 2 | Вывод ошибок (только запись) |
Каждый поток может быть связан с каким-либо устройством ввода/вывода.
В следующей таблице представлены стандартные устройства.
Устройство | Описание |
---|---|
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