Команда FOR задает запуск некоторой команды для каждого файла из заданного множества.
Работу команды for можно охарактеризовать так:
a) получение диапазона данных
b) присвоить переменной цикла for (например %%G) значение из диапазона данных
c) выполнить команду (иногда в команде участвует %%G, например, в качестве параметра)
d) выполнить шаги a), b), c), пока не будет достигнуто конечное значение из диапазона значений переменной цикла.
Очень хорошо команда for описана в справке w2k.
Синтаксис
for {% | %%}< переменная > in (< множество >) do < команда > [< ПараметрыКоманднойСтроки > ]
Параметры команды for следующие:
Параметр | Описание |
{%% | %}< переменная > | Обязательный элемент, который представляет замещаемое значение. Используйте один знак %, чтобы выполнить команду for из командной строки (не в командном файле). Два знака %% используются для команды for, выполняемой в составе командного файла (*.bat или *.cmd). Имена переменных чувствительны к регистру символов, и должны быть составлены из символов букв алфавита (например %a, %b или %c). |
(< множество >) | Обязательный элемент, указывает на один или несколько файлов, каталогов или текстовых строк, или диапазон значений, по которому должна проходить итерация команды for. Наличие круглых скобок обязательно. |
< команда > | Обязательный элемент, который указывает команду, выполняемого для каждого элемента множества (см. предыдущий параметр). |
ПараметрыКоманднойСтроки | Задает параметры командной строки, необходимые для использования с указанной командой (см. предыдущий параметр). |
/? | Отображение справки в командной строке для команды for. |
Команду for можно использовать в командном файле (*.bat, *.cmd) или непосредственно запускать в командной строке.
Атрибуты. К команде for применяются перечисленные ниже атрибуты.
• В команде for переменная %переменная (или %%переменная) будет заменяться текстовой строкой из заданного параметра множество, пока параметр команда не обработает все файлы этого множества.
• Имена параметров переменная команды for учитывают регистр буквы, они являются глобальными, и одновременно может быть активно не больше 52 переменных.
• Для обозначения параметра переменная можно использовать любые знаки, кроме цифр 0–9, чтобы не было конфликта с параметрами пакетных файлов %0–%9. Для простых пакетных файлов вполне достаточно обозначений с одним знаком, например %%f.
• В сложных командных файлах могут быть использованы и другие обозначения для параметра переменная.
Задание множества файлов. Параметр множество может представлять группу файлов или несколько групп файлов. Для задания групп файлов можно использовать подстановочные знаки (* и ?). Следующие множества файлов являются допустимыми:
(*.doc)
(*.doc *.txt *.me)
(jan*.doc jan*.rpt feb*.doc feb*.rpt)
(ar??1991.* ap??1991.*)
Когда используется команда for, первое значение в параметре множество заменяет параметр %переменная (или %%переменная), а затем для обработки этого значения выполняется указанная команда. Это продолжается до тех пор, пока не будут обработаны все файлы (или группы файлов), которые соответствуют значению параметра множество.
in и do. Ключевые слова in и do не являются параметрами, но они требуются для работы команды for. Если какое-то из этих слов пропущено, на экран будет выведено сообщение об ошибке.
Использование дополнительных форм команды for. Если расширения командного процессора разрешены (по умолчанию), то поддерживаются следующие дополнительные формы команды for.
• Только каталоги
Если параметр множество содержит подстановочные знаки (* и ?), команда, указанная в параметре команда, выполняется для каждого каталога (кроме множества файлов в указанном каталоге), совпадающего с параметром множество. Используется следующий синтаксис.
for /D {%% | %}переменная in (множество) do команда [ПараметрыКоманднойСтроки]
• Рекурсивная
Проходит по дереву каталогов с корнем в [диск:]путь, выполняя инструкцию for для каждого каталога в дереве. Если после ключа /R не задан каталог, предполагается текущий каталог. Если параметр множество задан одной точкой (.), то команда просто перечислит каталоги в дереве. Используется следующий синтаксис.
for /R [[диск:]путь] {%% | %}переменная in (множество) do команда [ПараметрыКоманднойСтроки]
• Итерация диапазона значений
Используйте переменную итерации для установки начального значения (НачальноеЗначение#), а затем перемещайтесь по диапазону значений, пока значение не превысит конечное значение множества (КонечноеЗначение#). /L выполнит итерацию, сравнив параметр НачальноеЗначение# с параметром КонечноеЗначение#. Если параметрНачальноеЗначение# меньше параметра КонечноеЗначение#, то выполняется команда. Когда переменная итерации превысит параметр КонечноеЗначение#, командная оболочка покидает цикл. Также можно использовать отрицательный параметр шаг# для перемещения в диапазоне убывающих значений. Например, (1,1,5) создает последовательность «1 2 3 4 5», а (5,-1,1) создает последовательность «5 4 3 2 1». Используется следующий синтаксис.
for /L {%% | %}переменная in (НачальноеЗначение#,шаг#,КонечноеЗначение#) do команда [ПараметрыКоманднойСтроки]
• Итерация и разбор файлов
Разбор файлов следует использовать для обработки вывода команды, строк и содержимого файла. Используйте переменные итерации для определения содержимого или строк, которые требуется проверить. Параметр КлючевыеСловаРазбора используется для изменения разбора. Используйте параметр маркера КлючевыеСловаРазбора для указания маркеров, которые воспринимаются как переменные итерации. Примечание. Без параметра маркера ключ /F проверяет только первый маркер.
Разбор файлов состоит в чтении вывода, строки или содержимого файла, разбиении его на отдельные строки текста и разборе каждой строки на ноль или маркеры. Цикл программы for затем вызывается с переменной итерации, установленной в маркер. По умолчанию /F передает первый отделенный пробелом элемент из каждой строки каждого файла. Пустые строки пропускаются. Используется также другой синтаксис.
for /F [«КлючевыеСловаРазбора»] {%% | %}переменная lin (МножествоИменФайлов) do команда [ПараметрыКоманднойСтроки]
for /F [«КлючевыеСловаРазбора»] {%% | %}переменная in («СимвольнаяСтрока») do команда [ПараметрыКоманднойСтроки]
for /F [«КлючевыеСловаРазбора»] {%% | %}переменная in (‘команда’) do команда [ПараметрыКоманднойСтроки]
Аргумент МножествоИменФайлов задает одно или несколько имен файлов. Каждый файл открывается, считывается и обрабатывается до перехода к следующему файлу параметра МножествоИменФайлов. Чтобы переопределить стандартное поведение разбора, укажите параметр «КлючевыеСловаРазбора». Это строка, заключенная в кавычки, которая содержит одно или несколько ключевых слов для указания различных режимов разбора.
Если используется параметр usebackq, используйте один из приведенных ниже синтаксисов:
for /F [«usebackqКлючевыеСловаРазбора»] {%% | %}переменная in («МножествоИменФайлов») do команда [ПараметрыКоманднойСтроки]
for /F [«usebackqКлючевыеСловаРазбора»] {%% | %}переменная in (‘СимвольнаяСтрока’) do команда [ПараметрыКоманднойСтроки]
for /F [«usebackqКлючевыеСловаРазбора»] {%% | %}переменная in (‘команда’) do команда [ПараметрыКоманднойСтроки]
В приведенной ниже таблице перечислены ключевые слова разбора, которые используются для параметра КлючевыеСловаРазбора.
Ключевое слово | Описание |
eol=c | Задает символ конца строки (только один символ). |
skip=N | Задает число строк, пропускаемых в начале файла. |
delims=xxx | Задает набор разделителей. Заменяет набор разделителей по умолчанию, состоящий из пробела и символа табуляции. |
tokens=X,Y,M-N | Задает элементы, передаваемые из каждой строки в тело цикла for при каждой итерации. В результате размещаются дополнительные имена переменных. Форма M-N задает диапазон, указывающий элементы с M-го по N-ый. Если последним символом строки tokens= является звездочка (*), то размещается дополнительная переменная, в которую помещается остаток строки после разбора последнего элемента. |
usebackq | Задает возможность использования кавычек для имен файлов в параметре МножествоИменФайлов. Задает исполнение строки, заключенной в обратные кавычки, как команды, а строки в одиночных кавычках — как команды в символьной строке. |
• Подстановка переменных
Были расширены модификаторы подстановок для ссылок на переменные в for. Приведенная ниже таблица перечисляет варианты синтаксических конструкций (на примере переменной I).
Переменная с модификатором | Описание |
%~I | Расширение %I, которое удаляет окружающие кавычки («»). |
%~fI | Расширение %I до полного имени пути. |
%~dI | Замена %I именем диска. |
%~pI | Замена %I на путь. |
%~nI | Замена %I одним именем файла. |
%~xI | Замена %I расширением имени файла. |
%~sI | Замена путем, содержащим только короткие имена. |
%~aI | Замена %I атрибутами файла. |
%~tI |
Замена %I временем модификации файла. |
%~zI | Замена %I размером файла. |
%~$PATH:I | Поиск в каталогах, перечисленных в переменной среды PATH, и замена %I полным именем первого найденного файла. Если переменная среды не определена или поиск не обнаружил файлов, модификатор выдает пустую строку. |
Приведенная ниже таблица перечисляет комбинации модификаторов, которые можно использовать для получения более сложных результатов.
Переменная с объединенными модификаторами | Описание |
%~dpI | Замена %I именем диска и путем. |
%~nxI | Замена %I именем файла и расширением. |
%~fsI | Замена %I полным именем пути с короткими именами. |
%~dp$PATH:I | Поиск в каталогах, перечисленных в переменной среды PATH, и замена %I именем диска и путем первого найденного файла. |
%~ftzaI | Замена %I строкой, аналогичной результату работы команды dir. |
В приведенных выше примерах %I и PATH могут быть заменены другими допустимыми значениями. Допустимое имя переменной for прекращает синтаксис %~.
Использование прописных букв в именах переменных, например %I, может улучшить восприятие программы и позволит избежать недоразумений с модификаторами, в которых строчные и прописные буквы не различаются.
Разбор строки. Конструкция for /F может быть использована непосредственно для строки. Для этого поместите параметр МножествоИменФайлов между скобками в одиночные кавычки (‘МножествоИменФайлов’). Параметр МножествоИменФайлов будет воспринят как одиночная строка ввода из файла и будет разобран.
Разбор вывода. Команду for /F можно использовать для разбора вывода команды. Для этого поместите параметр МножествоИменФайлов между скобками в обратные кавычки. Он будет воспринят как командная строка, которая передается дочернему интерпретатору командной строки Cmd.exe, а результаты работы команды помещаются в памяти и разбираются, как если бы они являлись файлом.
[Примеры]
В пакетных файлах используется следующий синтаксис для команды for:
for %%переменная in (множество) do команда [ПараметрыКоманднойСтроки]
Чтобы отобразить содержимое всех файлов, имеющих разрешение DOC или TXT, в текущем каталоге с помощью заменяемой переменной %f, введите следующую команду:
for %%f in (*.doc *.txt) do type %%f
В предыдущем примере каждый файл с расширением .doc или .txt в текущем каталоге будет подставляться вместо переменной %f, пока не будет выведено содержимое всех файлов. Для использования этой команды в пакетном файле нужно заменить каждую команду %f на %%а. В противном случае переменная игнорируется и выводится сообщение об ошибке.
Чтобы произвести разбор файла, игнорируя комментарии, можно использовать следующую команду:
for /F «eol=; tokens=2,3* delims=,» %i in (myfile.txt) do @echo %i %j %k
Данная команда производит разбор каждой строки в файле Myfile.txt, игнорируя строки, начинающиеся с точки с запятой, и передает второй и третий элементы из каждой строки в тело цикла команды FOR. Элементы разделяются запятыми или пробелами. Тело инструкции FOR использует %i для получения второго элемента, %j для получения третьего элемента и %k для получения оставшихся элементов в строке. Если имена файлов содержат пробелы, их следует заключать в кавычки (например, «ИмяФайла»). Для использования кавычек необходима команда usebackq. В противном случае кавычки рассматриваются как определение символьной строки для разбора.
Переменная %i объявлена явно в инструкции FOR. Переменные %j и %k объявлены явно при использовании tokens=. С помощью tokens= можно указать до 26 элементов, если это не вызовет попытки объявить переменную с именем, большим буквы «z» или «Z».
Для разбора вывода команды с помощью помещения параметра МножествоИменФайлов в скобки можно использовать следующую команду (пример выводит список имен всех переменных окружения):
for /F «usebackq delims==» %i IN (`set`) DO @echo %i
Ищем в директориях файлы с расширением html содержащие строку google:
for /R %%f in (*.html) do @findstr /m «google» %%f
FOR /L
выполнить команду для диапазона чисел
Синтаксис
FOR /L %%parameter IN (start,step,end) DO command
Где
start первое число (включительно)
step инкремент числа для каждого шага
end последнее число (включительно)
command выполняемая команда, здесь же указываются параметры командной строки для неё
%%parameter изменяемый при каждой прокрутке цикла параметр (переменная цикла)
Внутри командного файла в качестве параметра используйте %%G, а в командной строке %G (такие уж Микрософт придумал правила). (20,-5,10) будет генерить последовательность 20 15 10, а (1,1,5) последовательность 1 2 3 4 5.
Пример
FOR /L %%G IN (1,1,5) DO echo %%G
Можно использовать нечисловой список, например:
FOR %%G IN (Sun Mon Tue Wed Thur Fri Sat) DO echo %%G
[Другие команды for]
FOR — цикл по всем файлам в одной директории (исключая её подкаталоги)
FOR /R — цикл по всем файлам, включая подкаталоги
FOR /D — цикл через несколько папок
FOR /F — цикл через слова в текстовом файле или через вывод команды
syntax-FOR-Files
FOR %%parameter IN (set) DO command
syntax-FOR-Files-Rooted at Path
FOR /R [[drive:]path] %%parameter IN (set) DO command
syntax-FOR-Folders
FOR /D %%parameter IN (folder_set) DO command
syntax-FOR-List of numbers
FOR /L %%parameter IN (start,step,end) DO command
syntax-FOR-File contents
FOR /F [«options»] %%parameter IN (filenameset) DO command
FOR /F [«options»] %%parameter IN («Text string to process») DO command
syntax-FOR-Command Results
FOR /F [«options»] %%parameter IN (‘command to process’) DO command
[Связанные с for команды]
FORFILES (w2003 Server) — выборка списка файлов из директории для отображения или использования при обработке в bat-файле
GOTO метка — прямой переход на строку в командном файле, помеченную строкой :метка
IF — условное выполнение команды
[Equivalent Linux BASH commands]
for — Expand words, and execute commands
case — Conditionally perform a command
eval — Evaluate several commands/arguments
if — Conditionally perform a command
gawk — Find and Replace text within file(s)
m4 — Macro processor
until — Execute commands (until error)
while — Execute commands
[Условные обозначения форматирования]
Формат | Описание |
Курсив | Сведения, вводимые пользователем |
Полужирный шрифт | Элементы, вводимые без изменений |
Многоточие (…) | Параметр может быть введен в командной строке несколько раз |
В квадратных скобках ([]) | Необязательные элементы |
В фигурных скобках ({}), варианты, разделенные вертикальной линией (|). Пример: {even|odd} | Набор вариантов, из которых необходимо выбрать один |
Courier font | Программа или выходные данные |
[Ссылки]
1. Практические приемы программирования в bat-файлах.
На чтение 5 мин Просмотров 7.9к. Опубликовано
В этой статье мы рассмотри как используется цикл командной строки for для обработки текстовых строк и файлов. Тут будет фигурировать ключ /f, который меняет логику работы цикла командной строи (cmd) for и позволяет производить разбор любого текста по полочкам, так сказать.
Давайте начнем…
Цикл cmd for – обработка текста
Для обработки текста или содержимого текстового файла применяется следующая конструкция:
for /f [«параметры»] %%переменная in (источник) do (оператор)
Тут “параметры” задают параметры поиска, мы их рассмотрим ниже, “источник” – тут нужно указать или путь к текстовому файлу, или текст, или вывод команд, “оператор” – тут собственно, находятся команды для обработки текста. Сам текст можно хранить в переменной, имя которой мы зададим в качестве источника.
Значение “параметры” может быть одним или комбинацией таких параметров:
eol – позволяет задать признак концевого комментария (end-of-line comment character). Весь текст, что будет находиться после него, будет приниматься за комментарий, например,“eol=#” – тут символ # является признаком концевого комментария. Собственно, комментарий не будет обрабатываться.
skip – позволяет в цикле cmd for задать количество строк, которые нужно пропустить, счет идет с начала файла, например, “skip=10” – в данном случае будут пропущены строки от первой до десятой.
delims – параметр позволяет задать дополнительные разделители строки на подстроки. Так, стандартными разделителями является пробел и символ табуляции. Например, “delims=,.:” – тут мы определили, что запятые, точки и двоеточия являются разделителями.
tokens — данный параметр командной стоки цикла for cmd позволяет указать, какие номера полей строки, полученных из заданного текста, нужно передать для обработки в цикл. Полученные поля будут храниться в отдельной переменной. Фактически, если принимать каждое слово строки как отдельный элемент, то параметр tokens позволяет указать, какие именно слова по счету нужно обработать. Как упоминалось выше, стандартным разделителем является пробел и табуляция.
Для дополнительной переменной, как и для переменной инициализации, в качестве имени указывается латинская буква, большая или маленькая. Значения можно указывать как через запятые, например, “tokens=1,4, 9” – первый, четвертый и девятый элемент, так и через диапазон, например, “tokens=4-11” – с четвертого по одиннадцатый. Можно комбинировать: “tokens=4-10,15,20” – с четвертого по десятый, а также, пятнадцатый и двадцатый элемент. Если мы укажем в качестве последнего значения звездочку, то создастся еще одна переменная, которая будет хранить в себе все остальные элементы (строки) текста.
usebackq – данный параметр является довольно интересным и полезным, так как позволяет выполнять команды, передав их как параметр. Включив этот параметр, двойные кавычки будут применяться для имен файлов и пути к ним, обратные кавычки (`), они находятся на той же кнопке, что и символ (~) – для исполняемых команд, а одинарные кавычки – для литеральных строк.
Хорошо, теперь можно рассмотреть цикл cmd for и работу с ним на практике.
Допустим, у нас есть файл test.txt, в котором прописаны такие строки:
100 200 300
#это комментарий
400 500 600
10; 20; 30;
Попробуем выполнить такой код:
@echo off for /F "eol=#" %%A in(d:\work\test.txt) do echo %%A
На выходе функция echo выведет:
100
400
10;
Как видим, строка с комментарием не вывелась, но и остальные строки вывелись не полностью, что бы это исправить, напишем так:
@echo off for /F "eol=# tokens=*" %%A in(d:\work\test.txt) do echo %%A
Бинго, теперь нам вывело все строки полностью, кроме строки с комментариями, так как мы указали в параметре tokens значение *, то есть все. В предыдущем примере сценарий принимал пробелы как разделители.
Теперь запишем в текстовый файл такой текст:
Ukraina-Kijev-grivna-salo
Rossija-Moskva-rubl-bliny
Belorussija-Minsk-zajec-kartoska
Chechija-Praga-krona-pivo
@echo off for /f "tokens=1-4 delims=-" %%A in (d:\work\test.txt) do ( (@echo Strana:%%A Stolica:%%B Valuta:%%C Produkt:%%D)& Echo.)
Тут мы указали, что разделителем является тире, и указали, что надо обработать первые четыре поля строки, каждое из которых хранится в отдельной переменной. Как видим, в цикле for cmd идет обработка каждой строки из текста, на выходе мы получим:
Strana:Ukraina Stolica:Kijev Valuta:grivna Produkt:salo
Strana:Rossija Stolica:Moskva Valuta:rubl Produkt:bliny
Strana:Belorussija Stolica:Minsk Valuta:zajec Produkt:kartoska
Strana:Chechija Stolica:Praga Valuta:krona Produkt:pivo
Я специально вставил между строк пустую (echo.) что бы было лучше видеть.
Осталось рассмотреть пример с параметром usebackq:
@echo off set get_dir=d:\work\hello.txt for /f "usebackq" %%A in (`echo Hello, Wold ^>^> "%get_dir%"`)do echo OK type %get_dir% set get_dir=
В данном случаем мы выполняем команду: записываем фразу “Hello, Wold” в текстовый файл, путь к которому содержится в переменной get_dir. В конце выводим содержимое файла и удаляем переменную.
Знаю, знаю, мало примеров, ничего, я исправлюсь…
Learn how to use for
command to iterate over a list of items and run commands on each of them. We can run a command for each file in a directory, for example.
The simplest form of for
command is:
for %i in (set) do command command-arguments
Here set means the list of variants for which the command needs to be run. I’m not listing the for loop’s full options here as same can be found by running the command ‘for /? ‘. I have explained below with examples as to how to use for loop in different use cases.
Run command for each file
You want to run an application/command on selective files in a directory. You can use for command for this use case as below.
for /F %i in ('command to get files list') do command %i
For example, you want to open all the log files using notepad application.
for /F %i in ('dir /b *.log') do notepad %i
Here dir /b *.log
retrieves the list of all log files. For command iterates over the list and then opens them in notepad.
Run command for each user
You have a list of login names whose accounts need to be deleted from the system. Let’s say the user names are user1, user2, user3, user4, user5, user6. To delete all these user accounts in a single step we can run the below command.
for %i in (user1 user2 user3 user4 user5 user6) do net user /delete %i
If the list of user accounts is stored in a file then we can delete the accounts using the below command.
for /F %i in (filename) do net user /delete %i
Similarly, we can add new user accounts in batch using for command.
Select columns from a text file (Similar to Linux ‘cut’ command)
If you have a text file with multiple columns, and if you want to filter out certain unwanted columns from the file, you can do it using for command easily.
Let’s say my file has 4 columns separated with space as below.
abcd efgh ijkl mnop qrst uvwx yz1 adef efsa erafa afaf affaf ....
Now to print only the columns 2 and 4, I can use the below command.
for /F "tokens=2,4" %i in (test.txt) do @echo %i %j
You can redirect the output from the above command to a new text file using the operator pipe(‘|’)
If the file is separated with with comma(‘,’), as in CSV files, we can use the below command.
for /F "tokens=2,4 delims=," %i in (test.txt) do @echo %i %j
If you want to retain the comma(,) between the columns, you can add it as below.
for /F "tokens=2,4 delims=," %i in (test.txt) do @echo %i,%j
Цикл FOR /R … IN … DO …
С помощью ключа /R можно задать рекурсию в команде: FOR:
FOR /R [[диск:]путь] %%переменная IN (набор) DO команда [параметры]
В этом случае заданная команда выполняется для каталога [диск:]путь, а также для всех подкаталогов этого пути. Если после ключа R не указано имя каталога, то выполнение команды начинается с текущего каталога. Например, для распечатки всех файлов с расширением txt в текущем каталоге и всех его подкаталогах можно использовать следующий пакетный файл:
@ECHO OFF CLS FOR /R %%f IN (*.txt) DO PRINT %%f
Если вместо набора указана только точка (.), то команда проверяет все подкаталоги текущего каталога. Например, если мы находимся в каталоге C:\TEXT с двумя подкаталогами BOOKS и ARTICLES, то в результате выполнения файла:
@ECHO OFF CLS FOR /R %%f IN (.) DO ECHO %%f на экран выведутся три строки: C:\TEXT\. C:\TEXT\BOOKS\. C:\TEXT\ARTICLES\.
Цикл FOR /L … IN … DO …
Ключ /L позволяет реализовать с помощью команды FOR арифметический цикл, в этом случае синтаксис имеет следующий: вид:
FOR /L %%переменная IN (начало,шаг,конец) DO команда [параметры]
Здесь заданная после ключевого слова IN тройка (начало,шаг,конец) раскрывается в последовательность чисел с заданными началом, концом и шагом приращения. Так, набор (1,1,5) раскрывается в (1 2 3 4 5), а набор (5,-1,1) заменяется на (5 4 3 2 1). Например, в результате выполнения следующего командного файла:
@ECHO OFF CLS FOR /L %%f IN (1,1,5) DO ECHO %%f
переменная цикла %%f пробежит значения от 1 до 5, и на экране напечатаются пять чисел:
Числа, получаемые в результате выполнения цикла FOR /L, можно использовать в арифметических вычислениях. Рассмотрим командный файл my.bat следующего содержания:
@ECHO OFF CLS FOR /L %%f IN (1,1,5) DO CALL :2 %%f GOTO :EOF :2 SET /A M=10*%1 ECHO 10*%1=%M%
В третьей строке в цикле происходит вызов нового контекста файла my.bat с текущим значением переменной цикла %%f в качестве параметра командной строки, причем управление передается на метку :2 (см. описание CALL в разделе «Изменения в командах перехода»). В шестой строке переменная цикла умножается на десять, и результат записывается в переменную M. Таким образом, в результате выполнения этого файла выведется следующая информация:
10*1=10 10*2=20 10*3=30 10*4=40 10*5=50
Цикл FOR /F … IN … DO …
Самые мощные возможности (и одновременно самый запутанный синтаксис) имеет команда: FOR с ключом /F:
FOR /F ["ключи"] %%переменная IN (набор) DO команда [параметры]
Здесь параметр набор содержит имена одного или нескольких файлов, которые по очереди открываются, читаются и обрабатываются. Обработка состоит в чтении файла, разбиении его на отдельные строки текста и выделении из каждой строки заданного числа подстрок. Затем найденная подстрока используется в качестве значения переменной при выполнении основного тела цикла (заданной команды).
По умолчанию ключ /F выделяет из каждой строки файла первое слово, очищенное от окружающих его пробелов. Пустые строки в файле пропускаются. Необязательный параметр «ключи» служит для переопределения заданных по умолчанию правил обработки строк. Ключи представляют собой заключенную в кавычки строку, содержащую приведенные в табл. 3.3 ключевые слова:
Таблица
3.3.
Ключи в команде FOR /F
Ключ | Описание |
---|---|
EOL=C | Определение символа комментариев в начале строки (допускается задание только одного символа) |
SKIP=N | Число пропускаемых при обработке строк в начале файла |
DELIMS=XXX | Определение набора разделителей для замены заданных по умолчанию пробела и знака табуляции |
TOKENS=X,Y,M-N | Определение номеров подстрок, выделяемых из каждой строки файла и передаваемых для выполнения в тело цикла |
При использовании ключа TOKENS=X,Y,M-N создаются дополнительные переменные. Формат M-N представляет собой диапазон подстрок с номерами от M до N. Если последний символ в строке TOKENS= является звездочкой, то создается дополнительная переменная, значением которой будет весь текст, оставшийся в строке после обработки последней подстроки.
Разберем применение этой команды на примере пакетного файла parser.bat, который производит разбор файла myfile.txt:
@ECHO OFF IF NOT EXIST myfile.txt GOTO :NoFile FOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN (myfile.txt) DO @ECHO %%i %%j %%k GOTO :EOF :NoFile ECHO Не найден файл myfile.txt!
Здесь во второй строке производится проверка наличия файла myfile.txt; в случае отсутствия этого файла выводится предупреждающее сообщение. Команда FOR в третьей строке обрабатывает файл myfile.txt следующим образом:
Пропускаются все строки, которые начинаются с символа точки с запятой ( EOL=; ).
Вторая и третья подстроки из каждой строки передаются в тело цикла, причем подстроки разделяются пробелами (по умолчанию) и/или запятыми ( DELIMS=,).
В теле цикла переменная %%i используется для второй подстроки, %%j — для третьей, а %%k получает все оставшиеся подстроки после третьей.
В нашем примере переменная %%i явно описана в инструкции FOR, а переменные %%j и %%k описываются неявно с помощью ключа TOKENS=. Например, если в файле myfile.txt были записаны следующие три строки:
ААА ББББ ВВВВ,ГГГГГ ДДДД ЕЕЕЕЕ,ЖЖЖЖ ЗЗЗЗ ;КККК ЛЛЛЛЛ МММММ
то в результате выполнения пакетного файла parser.bat на экран выведется следующее:
ББББ ВВВВ ГГГГГ ДДДД ЖЖЖЖ ЗЗЗЗ
Замечание
Ключ TOKENS= позволяет извлечь из одной строки файла до 26 подстрок, поэтому запрещено использовать имена переменных, начинающиеся не с букв английского алфавита (a–z). Следует помнить, что имена переменных FOR являются глобальными, поэтому одновременно не может быть активно более 26 переменных.
Команда FOR /F также позволяет обработать отдельную строку. Для этого следует ввести нужную строку в кавычках вместо набора имен файлов в скобках. Строка будет обработана так, как будто она взята из файла. Например, файл следующего содержания:
@ECHO OFF FOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("ААА ББББ ВВВВ,ГГГГГ ДДДД") DO @ECHO %%i %%j %%k
при своем выполнении напечатает
Вместо явного задания строки для разбора можно пользоваться переменными среды, например:
@ECHO OFF SET M=ААА ББББ ВВВВ,ГГГГГ ДДДД FOR /F "EOL=; TOKENS=2,3* DELIMS=, " %%i IN ("%M%") DO @ECHO %%i %%j %%k
Наконец, команда FOR /F позволяет обработать строку вывода другой команды. Для этого следует вместо набора имен файлов в скобках ввести строку вызова команды в апострофах (не в кавычках!). Строка передается для выполнения интерпретатору команд cmd.exe, а вывод этой команды записывается в память и обрабатывается так, как будто строка вывода взята из файла. Например, следующий командный файл:
@ECHO OFF CLS ECHO Имена переменных среды: ECHO. FOR /F "DELIMS==" %%i IN ('SET') DO ECHO %%i
выведет перечень имен всех переменных среды, определенных в настоящее время в системе.
В цикле FOR допускается применение тех же синтаксических конструкций (операторов), что и для заменяемых параметров (табл. 3.4).
Таблица
3.4.
Операторы для переменных команды FOR
Операторы | Описание |
---|---|
%~Fi | Переменная %i расширяется до полного имени файла |
%~Di | Из переменной %i выделяется только имя диска |
%~Pi | Из переменной %i выделяется только путь к файлу |
%~Ni | Из переменной %i выделяется только имя файла |
%~Xi | Из переменной %i выделяется расширение имени файла |
%~Si | Значение операторов N и X для переменной %i изменяется так, что они работают с кратким именем файла |
Замечание
Если планируется использовать расширения подстановки значений в команде FOR, то следует внимательно подбирать имена переменных, чтобы они не пересекались с обозначениями формата.
Например, если мы находимся в каталоге C:\Program Files\Far и запустим командный файл следующего содержания:
@ECHO OFF CLS FOR %%i IN (*.txt) DO ECHO %%~Fi то на экран выведутся полные имена всех файлов с расширением txt: C:\Program Files\Far\Contacts.txt C:\Program Files\Far\FarFAQ.txt C:\Program Files\Far\Far_Site.txt C:\Program Files\Far\License.txt C:\Program Files\Far\License.xUSSR.txt C:\Program Files\Far\ReadMe.txt C:\Program Files\Far\register.txt C:\Program Files\Far\WhatsNew.txt
Циклы и связывание времени выполнения для переменных
Как и в рассмотренном выше примере с составными выражениями, при обработке переменных среды внутри цикла могут возникать труднообъяснимые ошибки, связанные с ранними связыванием переменных. Рассмотрим пример. Пусть имеется командный файл следующего содержания:
SET a= FOR %%i IN (Раз,Два,Три) DO SET a=%a%%%i ECHO a=%a%
В результате его выполнения на экран будет выведена строка «a=Три», то есть фактически команда
FOR %%i IN (Раз,Два,Три) DO SET a=%a%%%i
равносильна команде
FOR %%i IN (Раз,Два,Три) DO SET a=%%i
Для исправления ситуации нужно, как и в случае с составными выражениями, вместо знаков процента ( % ) использовать восклицательные знаки и предварительно включить режим связывания времени выполнения командой SETLOCAL ENABLEDELAYEDEXPANSION. Таким образом, наш пример следует переписать следующим образом:
SETLOCAL ENABLEDELAYEDEXPANSION SET a= FOR %%i IN (Раз,Два,Три) DO SET a=!a!%%i ECHO a=%a%
В этом случае на экран будет выведена строка «a=РазДваТри».
- SS64
- CMD
- How-to
Loop command: against a set of files — conditionally perform a command against each item.
Syntax FOR /F ["options"] %%parameter IN (filenameset) DO command FOR /F ["options"] %%parameter IN ("Text string to process") DO command Key options: delims=xxx The delimiter character(s). Default for strings = a space or TAB. skip=n A number of lines to skip at the beginning of the file. (default = 0) eol=; Character at the start of each line to indicate a comment The default is a semicolon ; tokens=n Specifies which numbered items to read from each line (default = 1) usebackq Use the alternate quoting style: - Instead of double quotes use single quotes for 'Text string to process' - Use double quotes for long file names in "filenameset". - Use back quotes for `command to process` Filenameset A set of one or more text files, the contents of which will be parsed. Enclose the list of files in parentheses (file1.txt,file2.txt). command The command to carry out, including any parameters. This can be a single command, or if you enclose it in (parentheses), several commands, one per line. %%parameter A replaceable parameter: in a batch file use %%G (on the command line %G)
FOR /F processing of a text file consists of reading the file, one line of text at a time and then breaking the line up into individual items of data called ‘tokens’. The DO command is then executed with the parameter(s) set to the token(s) found.
If you want to process the File Names rather than the content of the files, use the FOR /F command_to_process variant, with DIR /b as the command.
FOR parameters (%%A – %%Z)
Read the main FOR introduction page for a full description of assigning the replaceable %%parameter.
FOR parameters are used in all variations of the FOR command, it is a good idea to get up to speed with writing a basic FOR command before trying the more complex FOR / F variant.
By default, /F breaks up each line within the file at each blank space » «, and any blank lines are skipped, this default parsing behavior can be changed by applying one or more of the «options« parameters.
The option(s) must be contained «within quotes»
Within a FOR loop the visibility of variables is affected by SETLOCAL EnableDelayedExpansion, by default variable changes within the loop will not be visible until the loop completes.
usebackq
This option is useful when dealing with a filenameset that is a long filename containing spaces, it allows you to put double quotes around the filename.
Because double quotes are used to indicate a filename, it then uses single quotes instead of double quotes to indicate a text string and backquotes for a command to process. The backquote character ` is just below the ESC key on most keyboards.
Filenames which don’t contan spaces can still be referenced without using quotes.Usebackq can be abbreviated to useback (undocumented.)
Skip
SKIP will skip processing a number of lines from the beginning of the file.
SKIP includes empty lines, but after the SKIP is complete, FOR /F ignores (does not iterate) empty lines.
eol
The default end-of-line character is a semicolon ‘;’ when the FOR command reads a text file (or even a character string), any line that STARTS with the eol character will be ignored. In other words it is treated as a comment.
Use eol=X to change the eol character to X.Often you will want to turn this feature off so that every line of your data file is processed, in theory «eol=» should turn this feature off, but in practice this fails to work correctly — it will set eol to whatever the next character is, often the quote or space character. One workaround is to set eol to some unusual character that you don’t expect to ever encounter in the data file e.g. «eol=€» or «eol=¬». Another method is to escape every delimiter For /f tokens^=*^ delims^=^ eol^= %%a in (file.txt) do… (see forum for a discussion of this)
If you are using a delims then you can use the syntax «eol= delims= « which will set the eol so that nothing is treated as a comment.
None of the options can be repeated, if you include say
«eol=# eol=@» then only the second, «eol=@» is applied.
Delims
More than one delimiter can be specified so a string like ‘abcd;efg+hijk;lmno;pqr‘ can be broken up using «delims=;+».
for /f «tokens=1,2,3,4,5 delims=;+» %%G in (filename.txt) do echo %%G %%H %%K
For simple FOR commands which only process one item at a time, use «delims=»
This will place everything on the line into the first token. even if it contains spaces, e.g. a long filename.for /f «usebackq delims=» %%G in («file 1.txt»,»file 2.txt»,»file 3.txt») do echo %%G
You can use almost any character as a delimiter, but they are case sensitive.
delims should always the last item in the options string «tokens=3 delims= « not «delims= tokens=3»
This is because the quotations around the options string do double duty as a terminator for the delims character(s), which is particularly important when that character is a space.If you don’t specify delims it will default to «delims=<TAB><Space>»
This is different from the default delimiters for the CMD shell command line (Space,Tab,Comma,Equals,Semicolon). All of those can be specified as delimiters with the FOR command, but when including a space character as a delimiter it must be last one in the list. So this is valid: «delims=;= « and this is not valid: «delims=; =»Consecutive delimiters will be treated as one, even if they are different characters.
This means that if any data values are missing between delimiters the subsequent items in that line will be assigned a different token, e.g.Bread,Organic,$1.49
Cheese,,$2.99
In the first line the price will be assigned to the third token, but for the second line, the price will be assigned to the second token.
A common workaround for this issue is to pre-process the input data adding a placeholder character between any consecutive delimiters. e.g. replace ‘,,’ with ‘,~,’One special case is using a double quote («) as delimiter.
By default this will be misinterpreted as the end of the «delims string», a workaround for this is to remove the outer enclosing quotes and instead escape all the delimiter chars with ^.for /f tokens^=1^,2^,3^ delims^=^» %%G in (filename.txt) do echo %%G %%H %%I
n.b. some text editors will enter the TAB character as a series of spaces.
Tokens
tokens=2,4,6 Will cause the second, fourth and sixth items on each line to be processed (3 Tokens).
tokens=2-6 Will cause the second, third, fourth, fifth and sixth items on each line to be processed (5 Tokens).
tokens=* Will cause all items on each line to be processed as a single string Token.
tokens=3,* Will process the third item as one string token and then all subsequent text as a second string Token.
This can also be written as tokens=3*If the last character in the tokens= string is an asterisk ‘*’, then one additional parameter is added for all the remaining text on the line.
If an asterix is used in the tokens= string then it must be the last character in the string.
The parameter added by the asterix is based on the whole tokens= string and not on the number preceding the asterix, so if you select tokens 1,2,* the asterisk will represent the third and all subsequent items, and if you select tokens=19,2,1,* then the asterisk will represent the 20th and all subsequent items.
Each token specified will cause a corresponding parameter letter to be allocated. The letters used for tokens are case sensitive.
The following ASCII characters can be used as FOR tokens:
ASCII 63 — 93 inclusive, 31 tokens: ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ]
ASCII 95-123 inclusive, 29 tokens: _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z {
(there are a few other characters that can be used, but require escaping)A single FOR /F command can never parse more than 31 tokens, to use more requires a workaround with multiple FOR commands.
The tokens selected do not have to be listed in numeric order, though it is usually more readable to do so. The numbers selected in tokens= are automatically sorted, so for example tokens=5,7,1-3 and tokens=1,2,3,5,7 both produce the same result.
Matching the same token more than once (tokens=1,2,1) can give unpredictable results. Token variables can of course be used multiple times: Echo %%G %%H %%G
FOR tokens variables (or parameter names) are global, so in complex scripts which call one FOR statement from within another FOR statement you can refer to both sets of parameters.
Bugs: When using tokens=* (just an asterisk, and no other tokens) against a string which contains one or more delimiter characters and no other text, then the commands will be executed despite no text matching the token having been found, an empty parameter is generated. More complex patterns like tokens=1,* do not behave this way.
The precedence/priority of FOR command options is: usebackq > skip > delims > eol > tokens
Examples
Select items from a string and display them:
@Echo Off FOR /f "tokens=1,2,3,*" %%A in ("alpha beta gamma delta epsilon") DO echo A:[%%A] B:[%%B] C:[%%C] D:[%%D]
Copy the filenames listed in a text file (one per line) to a new destination:
FOR /f «delims=» %%G in (files.txt) DO copy «\\source\folder\%%G» «H:\destination\%%G»
Extract data from a text file which contains characters and commas (but no spaces or other punctuation):
January,Snowy,02
February,Rainy,15
March,Sunny,25FOR /F «tokens=1,3 delims=,» %%G IN (weather.txt) DO @echo %%G %%H
The tricky part is splitting up each the line into the right tokens, in this case I’m splitting on the comma character ‘,’
this splits the line into 3 chunks of text and we pull out the first and third items with «tokens=1,3»
token=1 (%%G) token=2 token=3 (%%H) (ignored) January 02 February 15 March 25 %%G is declared in the FOR statement and %%H is implicitly declared via the tokens= option.
An alternative way to retrieve the same data would be:
FOR /F «tokens=1,2,3 delims=,» %%G IN (weather.txt) DO @echo %%G %%I
Split a string at each space.
This can be done just as above, replacing «delims=,» with «delims= «
It is possible to specify either the tokens= and/or delims= options in any order, but whenever both delims and tokens are specified, they must be separated by a space, this space will NOT count as a token. For this reason it is recommended to always place delims as the last option before the closing quotation, it is much easier to see what is happening with one space (or no spaces) at the end of the string.
Parse a text string
A string of text will be treated just like a single line of input from a file, the string must be enclosed in double quotes (or single quotes with usebackq).
Echo just the date from the following string
FOR /F «tokens=4 delims=,» %%G IN («deposit,$4500,123.4,31-AUG-2021»)
DO @echo Date paid %%G
Parse the output of a command:
FOR /F %%G IN (‘»C:\program Files\command.exe»‘) DO ECHO %%G
Parse the contents of a file:
FOR /F «tokens=1,2* delims=,» %%G IN (C:\MyDocu~1\mytex~1.txt) DO ECHO %%G
FOR /F «usebackq tokens=1,2* delims=,» %%G IN («C:\My Documents\my textfile.txt») DO ECHO %%G
Filenameset
To specify an exact set of files to be processed, such as all .MP3 files in a folder including subfolders and sorted by date — just use the DIR /b command to create the list of filenames ~ and use this variant of the FOR command syntax.
Unicode
Many of the newer commands and utilities (e.g. WMIC) output text files in unicode format, these cannot be read by the FOR command which expects ASCII.
To convert the file format use the TYPE command.
Errorlevel
FOR does not, by itself, set or clear an Errorlevel, leaving that to the command being called.
FOR is an internal command.
“It’s completely intuitive; it just takes a few days to learn, but then it’s completely intuitive” ~ Terry Pratchett.
Related commands
FOR — Loop commands.
FOR — Loop through a set of files in one folder, or a list of folders.
FOR /R — Loop through files (recurse subfolders) .
FOR /D — Loop through several folders.
FOR /L — Loop through a range of numbers.
FOR /F — Loop through the output of a command.
FORFILES — Batch process multiple files.
IF — Conditionally perform a command.
SETLOCAL — Control the visibility of environment variables inside a loop.
Equivalent PowerShell: ForEach-Object — Loop for each object in the pipeline.
for example: Get-Content files.txt |Foreach{copy-item -path $_.FullName -destination «H:\destination\»}
Equivalent bash command (Linux): read (in a loop) — Read a line from standard input.
Copyright © 1999-2025 SS64.com
Some rights reserved