Как сделать цикл в bat файле

Обновлено: 03.07.2024

Командой FOR задаётся список команд, которые выполняются с КАЖДЫМ элементом набора.
Набор * пишется внутри IN (. )
Список команд пишется внутри DO (. )
Командная строка выполняет эти команды раз за разом, при этом текущий элемент набора находится в переменной, заданной после %% (назовём ее переменной цикла).

выведет имена и путь ко всем файлам с расширением .txt в папке C:\Users.

* Примеры под спойлером

Для команды For без ключей набором может являться :

1) Маска файлов* (или путь + маска файлов)
- в двойных кавычках, или без них:

IN (*.txt)
Результат: список файлов с расширением .txt в текущем каталоге.

IN (*.txt *.bat)
Результат: список файлов с расширениеми .txt и .bat в текущем каталоге.

IN ("C:\Folder 1\Doc_31-12-*.txt")
Результат: тот же. Но поиск ведется в каталоге C:\Folder 1 (заметьте с пробелом в имени);
имя файла начинается на Doc_31-12-

Прим.: FOR без ключа не умеет выводить список каталогов.
* маска файлов - это набор файлов, заданный с помощью подстановочных знаков * и/или ?
где * - обозначает 0 или больше любых символов в имени файла.
а ? - означает 0 или 1 любой символ в имени файла.

2) Строка
- в двойных кавычках, или без них:

Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?
Смысл цикла здесь в том, чтобы разбить такую строку по пробелам (или знакам табуляции)
и выполнить с каждой подстрокой список команд.

Если мы хотим, чтобы какая-то из строк не "билась" по пробелам, укажем ее в двойных кавычках:
При этом, чтобы не выводились сами кавычки "" мы используем модификатор*

(тильда) при раскрытии переменной цикла %%

*О других модификаторах переменной цикла можно почитать здесь и здесь.

3) еще есть смешанный тип. Это когда в наборе стоит маска (1-й описанный тип), а через пробел Строка (2 тип). ведет себя вполне ожидаемо, но вряд ли найдет себе применение.

О наборах для FOR с ключем /F далее в нижнем спойлере.


Ключ /F часто используется для построчного разбора файла, т.е.

выведет все строки файла 1.txt, который находится в корне диска C.

UseBackQ (Use back quotes) означает, что набор с двойными кавычками * подразумевает передачу в цикл имени файла.
delims= означает, что в переменную %%a будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
tokens=* приводит к тому же результату, что и delims= . Означает прекратить разбивку по разделителю после "0-го" токена, т.е. сразу же.

* Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать UseBackQ , тогда команда приняла бы вид:

но такая конструкция восприняла бы пробел в имени как определение нового файла, поэтому UseBackQ более приемлем.

** Примеры под спойлером

В цикле FOR /F вид задаваемого набора зависит от формы кавычек в IN (. ) , а также наличия ключевого слова UseBackQ

Виды наборов для FOR /F:
1) Набор файлов (задание маски недопустимо!)

без UseBackQ - задается без кавычек IN (. )
__ с UseBackQ - может задаваться как в кавычках так и без них. IN (. ) IN (". ")

Функционал: чтение содержимого файла(ов) построчно в переменную цикла!

Принцип работы: источником для разбиения по разделителю (delims) является содержимое файла, заданного внутри IN (. ) или файлов, если они заданы через пробел.

Исключение: принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.

А что получится, если установить delims= (возле равно - знак пробела) ?

В выводе на экран командой Echo %%a мы получим содержимое файла, где каждая из строк будет напечатана до первого встретившегося пробела.

2) Строка (допускаются практически любые символы)

без UseBackQ - задается с двойными кавычками IN (". ")
__ с UseBackQ - задается с одиночными прямыми кавычками IN ('. ')

3) Команда (сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))

без UseBackQ - задается с одиночными прямыми кавычками IN ('. ')
__ с UseBackQ - задается с одиночными обратными кавычками IN (`. `)

1.1. Чтение файла - Набор файлов

Результат: выведет подряд содержимое двух файлов - 1.txt и 2.txt из каталога c:\users
Прим.: Echo. - с точкой - это обход ошибки, чтобы можно было напечатать пустую строку, точнее строку с пробелами.

1.2. Чтение файла - Набор файлов + UseBackQ
Получаем возможность использовать пробелы.

Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).

Результат такой же.

3.1. Команда

Сначала выполняется Dir /AD-L , которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:

Далее цикл разбирает каждую строку по пробелам и табуляции на подстроки (токены).
На примере 1-й строки:
1-й токен (%%a)=29.12.2012 . 2-й токен (%%b)=15:16 . 3-й токен (%%c)=<DIR> . 4-й токен (%%d)=Favorites
.
Результат через Echo выводится на экран:

Папка Favorites Дата модификации 29.12.2012. Время 15:16
Папка Links Дата модификации 14.01.2013. Время 01:51
. и т.д. Результат такой же.
Альтернативный вариант нужен с целью, если одна из выполняемых команд требует точно такие же кавычки как и ключевое слово IN (. ).
Дабы не пользоваться символом экранирования, просто применяем другие кавычки.

Отличительной особенностью FOR /F является умение работать через токены * ,
а также поддержка дополнительных ключевых слов:
1) eol - знак комментария в начале строки (1-й символ). Т.е. строки с таким символом не будут обрабатываться. (по умолчанию, знак точки с запятой ; )
2) skip - пропуск определенного кол-ва обрабатываемых строк от начала файла
3) delims - задать другой разделитель(-ли) (по умолчанию, пробел и знак табуляции)
4) tokens - количество получаемых токенов (подстрок) в теле цикла и пределы разбивки по разделителю.
Также можно задать конкретный № токена, который попадет в первую переменную цикла.
5) usebackq - изменение правил использования кавычек внутри IN (. )

Детальную справку можно получить, введя в консоль команду FOR /?

* Токены - это подстроки, которые попадают в переменные цикла %% в каждой из итераций.
Они получаются в результате разбивки строки, заданной в IN (. ), по разделителю, заданному в Delims= (по умолчанию, пробел и знак табуляции).

В отличие, от FOR без ключа, в FOR /F все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке*, начиная с буквы, заданной после FOR /F %%

Команда for в виде числового цикла

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

for /l %%i in (1,1,10) do echo %%i

Переменная i называется счетчиком цикла. В силу своеобразия синтаксиса команды for , имя счетчика цикла должно состоять из одной буквы. Причем, если мы пишем командный файл, то перед именем счетчика цикла надо поставить сдвоенный знак процента, если же мы просто набираем команду в командной строке, то одиночный.

Логика работы этой команды такова. После слова in указан диапазон изменения счетчика цикла. В данном варианте команды это тройка чисел: начальное значение счетчика, шаг счета, предельное значение счетчика. При выполнении команды командный процессор сначала присвоит переменной i значение 1, а потом на каждом шаге цикла будет увеличивать его на 1, пока оно не превысит 10. Очевидно, таких шагов получится десять. Если бы в качестве шага счета мы указали число 2, то цикл выполнился бы пять раз. На каждом шаге цикла выполняется тело цикла, написанное после слова do . В приведенном примере это команда echo , которая выводит на экран текущее значение счетчика цикла.

Команда for для перебора файлов

Обычно команда for используется для перебора и обработки файлов. Надо сказать, что в достаточно простых случаях массовая обработка файлов выполняется с помощью подстановочных символов. Если, мы хотим всем файлам в текущем каталоге заменить расширение .htm на .html , мы вводим команду ren *.htm *.html . Но если то же самое надо сделать не в одном каталоге, а в дереве каталогов, то без команды for не обойтись. Приведенный ниже командный файл выполняет эту операцию для всех htm-файлов в подкаталоге website текущего каталога. Точнее, во всем дереве каталогов, которое находится внутри website.

for /r website %%i in (*.htm) do ren %%i %%

Ключ /r указывает на необходимость обхода каталога website и всех его внутренностей. Если его не указать (но тогда и каталог указывать не разрешается), то обработаны будут только файлы в текущем каталоге. Диапазоном значений счетчика цикла в данном варианте команды является множество всех файлов с расширением .htm, находящихся внутри каталога (точнее, дерева) website. Странная на первый взгляд запись

ni означает, что из значения переменной i требуется выделить только имя файла. В языке команд MS-DOS предусмотрено несколько таких модификаторов, например, запись

хi обозначает расширение файла. Все модификаторы описаны в справке по команде for .

Тело цикла может состоять из нескольких команд, заключенных в скобки.

for /r website %%i in (*.htm) do (

rem Выводим имя файла

rem Переименовываем файл

В том виде, в котором команда for перебирает файлы в директории, она не способна перебрать директории в нужной директории (т. е. видит только файлы). Нужно пользоваться другим синтаксисом.

for /r "C:\test" /d %%i in (*) do (

echo Name of folder: %%i

copy D:\filesKLIENT\Kontragent\111.grs "%%i"

Или с помощью фильтрации вывода команды dir:

for /f "delims=" %%i in (dir /b /s /a:d "C:\test") do (


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

1- Обзор цикла в языке Batch

  • Пробел (space)
  • Запятая ( , )
  • Точка с запятой ( ; )
  • Знак TAB

2- Цикл for (По умолчанию)

Цикл For по умолчаниюю языка Batch используется для повторения списка файлов.

Например скопировать некоторые файлы в папку (Заметьте файлы должны быть скопированы и папка должна быть на одном диске).


3- For /R

Цикл FOR /R используется для повторения на списках файлов. Включая файлы в подпапках. Называется рекурсией (Recurse).

  • [path] : Данный параметр является корневой папкой. Если нет данного параметра"папка включает выполняющийся сценарий файла" или "текущая папка" будет считаться корневой папкой.
  • set_of_file_filters : Список фильтров файлов. Напирмер *.txt , *.bat, . Или точка ( . ) значит все.
  • variable: Является названием переменной и должна иметь 1 единственный символ.

Пример ниже распечатывает список всех файлов *.txt или *.log в папке C:/Windows/System32 (Поиск включает и в подпапках. )


Пример ниже распечатывает все файлы C:/Windows/System32 (Влкючая файлы в подпапках. )

4- For /D

Цикл FOR /D используется для загрузки списка папок, которые являются подпапками текущей папки.

  • set_of_directory_filters : Список фильтров папок (directory filter) как en*, fr*. разделены стандартным разделителем (Standard Delimiter).
  • [/r]: Это параметр рекурсии (Recurse) и необязателен, если имеется данный параметр подпапки. будут участвовать в цикле.
  • variable: Является названием переменной и должна иметь 1 единственный символ.

Пример: Перечислить список подпапок C:/Windows.

Пример: Перечислить подпапки C:/Windows с названиями начинающимся на "en" или"fr"


5- For /L

Цикл For /L используется для загрузки на ряде цифр (range of numbers).

  • start: Первое значение переменной
  • step: После каждого повтора (iteration) значение переменной будет прибавлять 'step'.
  • end: Последнее значение.



6- For /F

Цикл For /F является сложным циклом, но сильным. Он читает содержание файла или несколько файлов. После анализирует содержание файлов. Содержание фала является текстом, оно будет разделено на несколько маленьких текстов, каждый отрывок текста называетя Token. Правило по умолчанию для разделения основано на пробелах (white space). Но вы можете кастомизировать правило разделения с помощью параметра ["delims=xxx"].

Цикл For /F так же используется для анализа содержания строки (string), или для выполнения набора команд.


  • set_of_filenames: Список из одного или нескольких файлов.
  • options: Опции, например: "delims=, tokens=1,2,4"
ОпцияОписание
delims=xxxСимволы разделителя (delimiter character(s)). По умолчанию это пробел (space)
skip=nКоличество первых строк, которые будут пропущены в содержании файла. По умолчанию skip=0
eol=;eol (End of Line): Определяет особый символ, который поставлен в начале строки, чтобы отметить эту строку как примечание. Строка примечания будет пропущена программой. По умолчанию это знак точки с запятой ( ; )
tokens=n1,n2,n3Определить нужные позиции (n1, n2, n3, ..), По умолчанию tokens=1
usebackq(Смотреть объяснение в примерах)


eol: Использовать для определения особого символа. По умолчанию является символ точки с запятой ( ; ). Поставлено в начале строки для отметки этой строки как примечания (comment), программа пропустит данную строку.


skip: Объявить, что количество первых строк будет пропущено, программа не проанализирует данные строки. по умолчанию skip=0


delims: Определияет символы разделителя (delimiter characters), помогая программе разделить каждую строку текста на мелкие параграфы, каждый параграф называется Token. Token индексированы 1, 2, 3, .


tokens: Объявляет список заинтересованных индексов, индексы разделены запятой. Например tokens=1,2,4. По умолчанию: tokens=1

TokensОписание
tokens=1,2,4Индексы 1, 2, 4 заинтересованы.
tokens=2-8Индексы от 2 до 8 заинтересованы
tokens=3,*Индексы 3, 4,5, . заинтересованы
tokens=*Все индексы заинтересованы

Например "tokens=1,2,4", значит только Token в позиции 1, 2, 4 заинтересованы, другие Token будут пропущены (Ignore).


Пример использования цикла FOR /F для чтения файла persons.txt:

Примечание: Названия переменных в цикле имеют только 1 символ.

Переменная %%i объявлено явным способом на цикле. Переменные %%j, %%k являются переменными, объявленные неявным способом (Названия неявных переменных являются следующие символы явных переменных).


View more Tutorials:

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.

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

командная строка for

Лично я, сперва добавляю в переменную окружения PATH путь к каталогу, в котором находится сценарий:

После этого я просто ввожу в консольном окне имя сценария, например, test.bat. Помните, что путь будет храниться в переменной окружения лишь в пределах текущего окна командной строки.

Командная строка for – перебор значений

Для перебора значений используется следующий синтаксис:

for /L %%переменная in (начало, шаг, конец) do (оператор)

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

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

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

В данном сценарии используются два цикла for командной строки, первый задает диапазон цифр от 0 до 5 с шагом 1, второй – диапазон цифр от 5 до 0 с шагом -1. То есть, прямой и обратный порядок. Функция ЭХО будет в виде списка выводить содержимое переменной B. Команда “echo.” вставляем между списками пустую строку.

Теперь попробуем найти сумму чисел от 0 до 100:

Сначала мы отключаем вывод эхо-отображений. Потом мы объявляем переменную summ с помощью ключевого слова set и присваиваем ей ноль. Далее в цикле for задаем начальное значение в 0, шаг в 1 и конечное значение в 100. Суммирование происходит в строке set/A summ+=%%B, тут к содержимому переменной summ будет добавляться содержимое переменной %%B. В конце мы выводим конечный результат и удаляем из окружения summ.

Теперь давайте посмотрим, как будет выглядеть код для нахождения факториала числа 5:

Тут практически тот же самый синтаксис, за исключением того, что мы задали отрицательный шаг и использовали оператор *=.

Хорошо, теперь усложним задачу: найдем сумму чисел от 0 до 10, исключив из расчета числа 5, 7 и 9:

Как видим, для проверки условия мы использовали условный оператор if. К сожалению, в командной строке нет логических операторов тип “ИЛИ” и “И”, как например, в языках vbscript и jscript, поэтому нам пришлось создавать вложенные операторы if. В результате, мы получили число 34. Также обратите внимание на оператор “neq” – проверка условия типа “НЕ РАВНО”.

Командная строка for – работа с файлами

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

for %переменная in (набор_файлов) do (оператор)

Базовый параметр тут переменная набор_файлов, которая может содержать:

  • отдельный файл, например, my_file.txt
  • групповой набор документов, заданный через шаблон, например, *.txt
  • список файлов, который разделяется пробелами, причем каждый элемент списка тоже может содержать шаблон, например, my_file.txt *.doc my*.avi

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

В следующем примере происходит вывод всех файлов из каталога d:\work\ с расширением .txt:

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

Естественно, можно задать условие для вывода всех файлов с расширениями, например, .txt, .avi и .pdf.

В данном случае переменная work_dir содержит путь к папке d:\work, в цикле командной строки for мы добавляем к переменной нужные расширения. В конце сценария происходит удаление переменной work_dir.

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

Можно попробовать получить список имен файлов и их размер:

z позволяет получить размер файла в байтах.

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

Спасибо за внимание. Автор блога Владимир Баталий

Читайте также: