Запуск некоторой команды для каждого файла из заданного множества.
- Run multiple commands simultaneously
- Run multiple commands sequentially
- Only run the next command in the queue if the first executes successfully.
- Only execute the next command in the queue if the first failed to execute successfully.
These are a few use cases that we will address in this article.
![]()
Циклическиe операции FOR
FOR %%a IN (C:\Users\*.txt) DO echo %%a *
Примеры под спойлером
Для команды For без ключей
набором может являться
:
1) Маска файлов*
(или путь + маска файлов)
– в двойных кавычках, или без них:
Результат: список файлов с расширением .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) Строка
– в двойных кавычках, или без них:
Строкой считается любая последовательность символов, если она не содержит знаков маски * или ?
Смысл цикла здесь в том, чтобы разбить такую строку по пробелам (или знакам табуляции)
и выполнить с каждой подстрокой список команд.
FOR %%a IN (гитара рыбка) do echo Моя %%a Если мы хотим, чтобы какая-то из строк не “билась” по пробелам, укажем ее в двойных кавычках:
FOR %%a IN (гитара "дорогая рыбка") do echo Моя %%~a Моя гитара
Моя дорогая рыбка
При этом, чтобы не выводились сами кавычки “” мы используем модификатор *
~ (тильда) при раскрытии переменной цикла
*
О других модификаторах переменной цикла можно почитать здесь
и здесь
.
О наборах для FOR с ключем /F
далее в нижнем спойлере.
часто используется для построчного разбора файла, т.е.
FOR /f "usebackq delims=" %%a IN ("C:\1.txt") DO echo %%a выведет все строки файла 1.txt, который находится в корне диска C.
(Use back quotes) означает, что набор с двойными кавычками
подразумевает передачу в цикл имени файла.
означает, что в переменную
будет записана вся строка (без разделения по пробелу или знаку табуляции, т.к. стандартный разделитель заменен на NULL (пустой символ).
В такой вариации:
приводит к тому же результату, что и
. Означает прекратить разбивку по разделителю после “0-го” токена, т.е. сразу же.
Этот вариант необходим для работы с файлом, путь или имя которого содержит пробелы.
Можно было не использовать
, тогда команда приняла бы вид:
FOR /f "tokens=" %%a IN (C:\1.txt) DO echo %%a но такая конструкция восприняла бы пробел в имени как определение нового файла, поэтому UseBackQ более приемлем.
Примеры под спойлером
Виды наборов для FOR /F:
1) Набор файлов
(задание маски недопустимо!)
чтение содержимого файла(ов) построчно в переменную цикла
!
Принцип работы:
Исключение:
принятый по-умолчанию разделитель (пробел и знак табуляции) для этой конструкции цикла не применяется.
А что получится, если установить delims= (возле равно – знак пробела) ?
FOR /F "delims= " %%a in (1.txt) do echo %%a 2) Строка
(допускаются практически любые символы)
3) Команда
(сначала выполняется она, а уже ее результаты обрабатываются циклом как строка(-и))
1.1. Чтение файла – Набор файлов
FOR /F %%a IN (c:\users\1.txt c:\users\2.txt) do echo.%%a 1.2. Чтение файла – Набор файлов
+ UseBackQ
Получаем возможность использовать пробелы.
FOR /F "usebackq" %%a IN ("c:\folder 1\1.txt") do echo.%%a Результат: выведет содержимое файла 1.txt из каталога c:\folder 1
(заметьте, в имени папки есть пробел).
FOR /F %%a in ("Каждое слово в отдельную переменную") echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e a=Каждое; b=слово; c=в; d=отдельную; e=переменную
2.2. Строка
+ UseBackQ
FOR /F "UseBackQ" %%a in ('Каждое слово в отдельную переменную') echo a=%%a; b=%%b; c=%%c; d=%%d; e=%%e Результат такой же.
For /F "tokens=1-4" %%a IN ('Dir /A:D-L') Do Echo Папка %%d Дата модификации %%a. Время %%b Сначала выполняется
, которая выводит информацию о папках в текущем каталоге.
Вот что попадает под разбор циклу:
3.2. Команда
+ UseBackQ
For /F "Usebackq tokens=1-4" %%a IN (`Dir /A:D-L`) Do Echo Папка %%d Дата модификации %%a. Время %%b Детальную справку можно получить, введя в консоль команду
В отличие, от FOR без ключа, в
все токены (все подстроки одной строки) попадают сразу В ПЕРВУЮ ИТЕРАЦИЮ цикла.
Они будут распределены по РАЗНЫМ переменным цикла, идущим в алфавитном порядке *
, начиная с буквы, заданной после FOR /F %%
FOR /F %%a IN ("гитара рыбка") do echo Моя %%a и моя %%b. Максимальное кол-во токенов составляет – 26,
если начальным указать %%a либо %%A (регистр имеет значение)
При этом переход с %%z в %%A не происходит. Остальная часть подстрок опускается.
Можно проверить:
For /F "tokens=1,2" %%z IN ("1 2") do echo %%A Бывают случаи, когда требуется разбить строку по специфическому разделителю и при этом выполнить одну и ту же команду над каждой из подстрок (токеном). Кол-во токенов неизвестно.
Метод показал Anonymоus
в теме Символ переноса строки в переменной окружения
Алгоритм заключается в замене разделителя на пробел с одновременным заключением каждого токена в двойные кавычки. Далее строка разбирается обычным циклом FOR без ключа.
1.2. Чтение файла (сложный пример).
Давайте возьмем сложный пример, и раскусим “крепкий орешек”

FOR /F "UseBackQ skip=1 tokens=2 delims=/\ eol=" %%X in ("%~dp01.txt") do echo %%X Имеем в распоряжении файл 1.txt, который находится рядом с батником.
Содержимое файла 1.txt написал(а):
Порядок разбора (или “как прибл. будет думать ком. строка”):
1)
– означает каталог, где находится батник, например c:\temp\
4) Итак, первая строка так и называется “первая строка”

– означает пропустить от начала файла 1-у строку,
значит идем дальше:
7) Теперь смотрим сюда
– значит, что первой букве цикла нужно присвоить значение 2-го токена.
Первая буква цикла у нас X. Переменная называется
А второй токен – это подстрока “кода”
С 3-ей строкой потренируйтесь самостоятельно.
FOR /L %%a IN (0,2,6) DO echo %%a Указанная команда выведет:
Прим.: дробные числа командной строкой не поддерживаются.
![]()
Особенности, которые распространяются на циклы FOR
0) Если нужно записать в наборе несколько команд
, то используем:
а) знаки амперсанда &, если мы хотим записать все в одну строку:
FOR /L %%a IN (1,1,10) DO echo Найден файл:& echo %%a б) знаки скобок, если хотим разбить команды в несколько строк для наглядности и удобства:
FOR /L %%a IN (1,1,10) DO ( echo Найден файл: echo %%a
) 1) Пустые строки в содержимом файлов и выводе команд игнорируются.
2) Если предполагается получение пустого токена, остальные токены смещаются.
К примеру,
имеем файл с содержимым:
FOR /F "tokens=1,2,3 delims=/" %%a in (file.txt) do echo a=%%a; b=%%b; c=%%c 4) Регистр переменной цикла имеет значение.
5) Изменить вручную значение переменной цикла нельзя. Например,
не даст эффекта.
6) После выхода из цикла переменная цикла уничтожается.
7) Внутри цикла можно использовать не более 1-го комментария вида :: (иначе, будет критическая ошибка и “вылет” из пакетного файла)
Вместо этого используем
.
8) Внутри цикла можно использовать не более 1-й метки (иначе, будет такой же “вылет”).
Пример максимально допустимой конструкции:
@echo off
for %%n in ( 0 1 2 3 4 5 6 7 8 9 ) do ( :label echo %%n :: comment echo %%n
) 9) Тем не менее из цикла можно безвозвратно выйти на метку Goto metka
а также выйти в подпрограмму и вернутся снова в цикл точно в ту же позицию через команду Call :metka
В конце подпрограммы должна стоять команда
10) Для получения значения обычной переменной внутри цикла в случае, если этой переменной было присвоено новое значение внутри тела этого же цикла, необходимо раскрывать переменную через знаки восклицания
– это называется отложенное расширение переменных.
Перед использованием такого способа, его нужно включить, задав в начале пакетного файла команду:
SetLocal EnableDelayedExpansion Иначе, если использовать обычный способ раскрытия
, мы получим значение переменной, присвоенное ей еще до входа в цикл.
Точно таким же образом (через ! ) необходимо раскрывать переменную времени внутри цикла, т.к. иначе для цикла время “замерзает”.
Происходит это потому, что в цикл попадает т.н. “слепок” переменных среды. И работа с ними через % происходит уже как с копией данных, а не актуальными значениями.
FOR /F %%A IN ('dir %someparam% 2^>nul') do rem Также можно перенаправить 2-й поток, чтобы он обрабатывался вместе с первым, вместо его вывода на экран:
FOR /F %%A IN ('dir %someparam% 2^>^&1') do rem Собственно, чтобы наоборот, обрабатывать 2-й поток вместо первого, можно воспользоваться следующей конструкцией:
FOR /F %%A IN ('dir %someparam% 1^>nul 2^>^&3') do rem 12) При запуске цикла из консоли (cmd.exe) переменные цикла нужно указывать без удвоения знака процента
.
Это же правило касается вызова цикла через Shell-подобные команды на других языках программирования.
13) Переменную цикла нельзя раскрыть внутри строки модификаторов другого цикла:
но есть способ обхода от ComSpec
:
Как известно, значение переменной цикла нельзя просто подставить в качестве модификатора в другой, вложенный, цикл
:
for /f "tokens=2" %i in ("1 3 5") do @for /f "tokens=%i" %j in ("1 3 5 7 9") do @echo %j
Результатом такой подстановки будет вывод ошибки:
[quote]
Непредвиденное появление: %i".
[/quote]
Если же сделать так:
[code]
for /f "tokens=2" %i in ("1 3 5") do @set x=%i
for /f "tokens=%x%" %j in ("1 3 5 7 9") do @echo %j то ошибки не будет:
Но как всё же осуществить корректный вывод во вложенном цикле?
Если попробовать присвоить какой-нибудь переменной значение переменной первого цикла, а эатем запустить второй цикл с этой переменной в новом экземпляре интерпретатора с включённым отложенным расширением, то ошибка не исчезает:
for /f "tokens=2" %i in ("1 3 5") do @set x=%i& cmd/v/c for /f "tokens=!x!" %j in ("1 3 5 7 9") do @echo %j Непредвиденное появление: !x!”.
Оказалось, что это можно сделать проще, а именно просто запустить вложенный цикл в новом экземпляре интерпретатора
:
for /f "tokens=2" %i in ("1 3 5") do @cmd/c for /f "tokens=%i" %j in ("1 3 5 7 9") do @echo %j Последнее редактирование: 28 Июн 2016
![]()
1) Использование ключа /D
(спасибо sov44
) Переименовать файл в имя папки
2) первый по алфавиту файл
for /F %%i in ("*.txt") do set FILE_NAME=%%~nxi Берет первый по алфавиту файл, заданный маской *.txt, и сразу выходит из цикла.
Можно также задавать конкретный путь перед маской.
(спасибо pistol
за найденный пример.)
3) Использование модификатора %~$ПУТЬ:I для поиска файла в папках, заданных переменной среды Path:
for %%a in ("wmic.exe") do echo %%~s$PATH:a где:
wmic.exe – наш искомый файл
Переменная среды ПУТЬ (в примере PATH), и переменная %a
заменяется на полное имя первого найденного файла.
Если переменная ПУТЬ не определена или в результате поиска
не найден ни один файл, то этот модификатор заменяется на пустую строку.
4) Разбивка текста по разделителям
for %%i in (text) do echo %%i где text – текст, разбивка на итерации которого происходит по знакам:
- пробел
- парные кавычки
- табуляция
- запятая
- точка с запятой
- знак равенства.
Примечание от ComSpec
:
Надо бы ещё исключить кавычки из перечня разделителей и написать, что парные двойные кавычки, наоборот, объединяют часть строки (или всю строку) вместе с перечисленными разделителями в одно “слово”, и при этом сами сохраняются, и если к ним справа или слева примыкает группа символов без разделителей, то она также входит в состав этого “слова”.
Исходя из сказанного, надо признать, что данный метод крайне ненадёжен для подсчёта слов (в обычном смысле понятия “слово”) в реальных текстах.
5) Удаление лидирующих нулей
:: математические операции со значениями 08 и 09 будут приводить к ошибкам
set /a m=%date:~3,2%
:: поэтому для начала, удаляем лидирующие нули
set m=%date:~3,2%
for /f "tokens=* delims=0" %%j in ("%m%") do set m=%%j
echo %m% Дополнение от Smitis
:
Если количество цифр в числе, в котором надо удалить лидирующие нули, известно заранее, то можно поступить так (для месяца из двух цифр)
:: В вычитаемом числе должно быть столько нулей, сколько цифр исходном числе.
:: Исходное число должно быть не длинее 9-ти разрядов.
set /a m=1%date:~3,2%-100
echo %m% Можно сразу подставлять такую конструкцию в нужное выражение.
Добавление лидирующих нулей
: https://safezone.cc/threads/cmd-dobavit-lidirujuschie-nuli.32940/
6) Распределение итераций цикла for без ключей.
Дополнение: Получение пустых значений токенов в цикле с командой FOR
for /f tokens^=1^,2^,3^ delims^=^" %%a in ("1""2""3") do echo %%a--%%b--%%с 8) Циклическая конструкция с использованием сочетания модификаторов
(от ComSpec)
“tokens=* delims=<символы>”
является универсальным “триммером” для удаления любых заявленных символов из начала строки до первого незаявленного символа.
for /f "tokens=* delims=0123456789" %i in ("972630014380333075vfh658weghui72qcfgb3658eyfgcb7652qweuy8") do @echo %i 9) получение результата выполнения программы в переменную
(если результатат – 1 строка)
for /f "delims= eol=" %%a in ('file.exe') do set "var=%%a" Последнее редактирование: 18 Мар 2019
Run multiple commands using the batch script
- Open a new Notepad file that has no text written on it.

- Enter all the commands in the Notepad file that you want to be executed together. For example, I want to flush DNS first, then I will renew it. For this, I have to run four commands one by one. But here, I have added all the commands in a single file.

- Now save this file with an appropriate name, and don’t forget to save the file with “.bat” extension. Otherwise, you won’t be able to run the script.

- Go to the location where you have saved the Batch Script file. Double click on it to run the file. This won’t take long to execute all your commands successfully.

This is a way to run multiple commands easily and quickly. I hope this will work for you. If you don’t want your commands to run with Batch Script, you may apply other solutions described below.
Параметры
- { %
переменная
| %%
переменная
} - Обязательный параметр. Замещаемый параметр. Используйте %
переменная
для
выполнения команды for
из командной строки. Используйте %%
переменнаядля выполнения команды for
в пакетном файле. Переменные учитывают регистр и могут
быть представлены со значением альфа, например, %A, %B или %C. - (
множество
) - Обязательный параметр. Задает один или несколько файлов, каталогов, диапазон значений или
текстовых строк, подлежащих обработке заданной командой. Скобки являются обязательными. - команда
- Обязательный параметр. Задает команду, которая будет выполнена для каждого файла, каталога
диапазона значений или текстовой строки, включенной в указанный параметр
(
множество
)
. - ПараметрыКоманднойСтроки
- Задает параметры командной строки, которые используются с указанной командой.
- /?
- Отображение справки в командной строке.
Примеры
В пакетных файлах используется следующий синтаксис для команды for
:
Чтобы отобразить содержимое всех файлов, имеющих разрешение .doc или .txt, в текущем каталоге
с помощью заменяемой переменной %f
, введите следующую команду:
for %f in (*.doc *.txt) do type %f
В предыдущем примере каждый файл с расширением .doc или .txt в текущем каталоге будет
подставляться вместо переменной %f
, пока не будет выведено содержимое всех файлов.
Чтобы использовать данную команду в пакетном файле, следует заменить все вхождения %f
на %%f
. В противном случае переменная игнорируется, и отображается сообщение об
ошибке.
Данная команда производит разбор каждой строки в файле Myfile.txt, игнорируя строки,
начинающиеся с точки с запятой, и передает второй и третий элементы из каждой строки в тело
цикла команды FOR
. Элементы разделяются запятыми и/или пробелами. Тело инструкции
FOR
использует %i
для получения второго элемента, %j
для получения
третьего элемента и %k
для получения оставшихся элементов в строке. Если имена файлов
содержат пробелы, их следует заключать в кавычки (например, ”
ИмяФайла
”
).
Для использования кавычек необходима команда usebackq
. В противном случае кавычки
рассматриваются как определение символьной строки для разбора.
Переменная %i
объявлена явно в инструкции FOR
, а %j
и %k
объявлены неявно с помощью tokens=
. С помощью tokens=
можно указать до 26
элементов, если это не вызовет попытки объявить переменную с именем, большим буквы “z” или
“Z”.
Для разбора вывода команды с помощью помещения параметра МножествоИменФайлов
в скобки
можно использовать следующую команду:
В данном примере перечисляются имена переменных среды в текущем окружении.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать
раздел форума
этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен
здесь
Run Multiple Commands Through &, &&, and || sign
With this solution, I am giving you three possibilities on how you want to run your multiple commands in CMD.
- The first one is using “&”
Combine your two commands with “&”
sign. This will allow your second command to run after the complete execution of the first command.
For example:
ipconfig /flushdns & ipconfig /renew

The second command will run as soon as the first command completely runs. It won’t matter that first command has run successfully or not. - But if you want to run the second command, after the success of the first command. Then, enter “&&”
sign between your two commands.
ipconfig /flushdns && ipconfig /renew

- The third case is, the second command will run only if the first command has not executed successfully. For this enter “||”
between two commands.
ipconfig /flushdns || ipconfig /renew


