Команда FOR организует циклическую обработку в CMD: перебирает файлы по маске, строки текста, числовые диапазоны и вывод других команд. Без FOR невозможно написать сколько-нибудь серьёзный BAT-скрипт — это главный инструмент автоматизации в командной строке Windows.
- Синтаксис команды FOR
- Ключи и параметры
- Примеры использования
- Перебор файлов по маске
- Числовой цикл
- Рекурсивное удаление файлов по расширению
- Перебор каталогов
- Чтение строк из файла
- Разбор CSV-файла
- Захват вывода команды
- Частые ошибки и решения
- Когда применять, а когда нет
- FAQ
- Почему в BAT-файле пишут %%i, а в CMD — %i?
- Как выполнить несколько команд внутри FOR за одну итерацию?
- Как пропустить заголовочную строку при чтении CSV?
- Можно ли вложить один FOR в другой?
- Как получить только имя файла без пути и расширения внутри FOR?
- Аналог FOR в PowerShell?
Синтаксис команды FOR
FOR [модификатор] %%переменная IN (набор) DO команда [параметры]
Плейсхолдеры:
%%переменная— однобуквенная переменная цикла. В BAT-файлах пишется как%%i, в интерактивном режиме CMD — как%i.(набор)— список значений, маска файлов, диапазон чисел или команда в зависимости от модификатора.команда— выполняется для каждой итерации; при необходимости нескольких команд используйтеCALL :меткаили скобки с&.
Ключи и параметры
| Модификатор | Описание | Пример |
|---|---|---|
| (без модификатора) | Перебирает набор значений или файлы по маске в текущем каталоге | FOR %%f IN (*.txt) DO ECHO %%f |
/D | Перебирает только каталоги (а не файлы) по маске | FOR /D %%d IN (C:\*) DO ECHO %%d |
/R [путь] | Рекурсивно обходит дерево каталогов начиная с указанного пути | FOR /R C:\Project %%f IN (*.log) DO DEL %%f |
/L | Числовой диапазон: (начало шаг конец) | FOR /L %%i IN (1 1 10) DO ECHO %%i |
/F | Разбирает строки файла или вывод команды на токены | FOR /F %%a IN (data.txt) DO ECHO %%a |
/F "delims=X" | Задаёт разделитель токенов (по умолчанию пробел и табуляция) | FOR /F "delims=," %%a IN (csv.txt) DO ECHO %%a |
/F "tokens=N" | Указывает, какой токен (или несколько через запятую) использовать в переменной | FOR /F "tokens=1,2" %%a IN (data.txt) DO ECHO %%a %%b |
/F "skip=N" | Пропустить первые N строк файла (например, заголовок) | FOR /F "skip=1" %%a IN (report.txt) DO ECHO %%a |
/F "eol=C" | Символ начала комментария (строки, начинающиеся с C, пропускаются) | FOR /F "eol=;" %%a IN (config.ini) DO ECHO %%a |
/F "usebackq" | Позволяет использовать обратные кавычки для команд и одинарные для литеральных строк | FOR /F "usebackq" %%a IN (`DIR /B`) DO ECHO %%a |
Примеры использования
Перебор файлов по маске
Вывести имена всех текстовых файлов в текущем каталоге.
FOR %%f IN (*.txt) DO ECHO %%f
В BAT-файле: двойной знак процента (%%f). В интерактивной строке CMD: FOR %f IN (*.txt) DO ECHO %f.
Числовой цикл
Вывести числа от 1 до 10 с шагом 1.
FOR /L %%i IN (1 1 10) DO ECHO %%i
Синтаксис (начало шаг конец). Для обратного счёта: FOR /L %%i IN (10 -1 1) DO ECHO %%i.
Рекурсивное удаление файлов по расширению
Удалить все временные файлы .tmp во всём дереве каталогов.
FOR /R C:\Project %%f IN (*.tmp) DO DEL "%%f"
Ключ /R заставляет FOR обходить все подкаталоги. Пути с пробелами берутся в кавычки.
Перебор каталогов
Создать одинаковую структуру во всех подкаталогах.
FOR /D %%d IN (C:\Projects\*) DO MKDIR "%%d\logs"
Ключ /D перебирает только папки, не трогая файлы.
Чтение строк из файла
Прочитать список серверов и выполнить PING для каждого.
FOR /F %%s IN (servers.txt) DO PING -n 1 %%s
Каждая строка файла servers.txt передаётся в переменную %%s. Пустые строки и строки-комментарии (начинающиеся с ;) пропускаются по умолчанию.
Разбор CSV-файла
Прочитать первые два поля из CSV (разделитель — запятая).
FOR /F "tokens=1,2 delims=," %%a IN (data.csv) DO ECHO Имя: %%a Значение: %%b
Переменная %%a получит первый токен, %%b — второй. Токены назначаются последовательным буквам алфавита.
Захват вывода команды
Получить дату последнего изменения каждого файла из вывода DIR.
FOR /F "usebackq tokens=1,2,3,4" %%a IN (`DIR /TC *.log`) DO ECHO %%a %%b %%c %%d
Обратные кавычки с usebackq позволяют передать вывод команды напрямую в FOR.
Частые ошибки и решения
| Ошибка / симптом | Причина | Решение |
|---|---|---|
Переменная %i не раскрывается внутри блока IF или вложенного цикла | Стандартное раскрытие переменных происходит до выполнения блока | Включите отложенное раскрытие: добавьте SETLOCAL ENABLEDELAYEDEXPANSION в начало скрипта и используйте !переменная! вместо %переменная% |
| Пути с пробелами обрезаются — команда работает только с первой частью пути | Пробел воспринимается как разделитель | Всегда берите пути в кавычки: DO DEL "%%f" |
FOR /F игнорирует пустые строки в файле | Это штатное поведение — пустые строки пропускаются | Для обработки пустых строк используйте временный маркер: замените пустые строки плейсхолдером перед обработкой |
В интерактивном CMD скрипт не работает из-за %% | Двойной процент предназначен только для BAT-файлов | В интерактивном режиме CMD используйте одиночный %: FOR %f IN (*.txt) DO ECHO %f |
FOR /L зависает при большом диапазоне | Число итераций слишком велико | Убедитесь, что шаг и направление (знак) заданы корректно: (1 1 1000000) создаст миллион итераций |
Когда применять, а когда нет
Команда FOR незаменима в BAT-скриптах для пакетной обработки файлов, автоматизации рутинных задач и разбора текстовых данных. Она доступна во всех версиях Windows без дополнительных инструментов. Ограничения: синтаксис FOR сложен и нечитаем при вложенных циклах; нет встроенной обработки ошибок; разбор строк через /F не поддерживает Unicode корректно. Для сложной логики, работы с объектами и Unicode-данными переходите на PowerShell: цикл foreach ($f in Get-ChildItem *.txt) { ... } читается значительно проще и мощнее.
FAQ
Почему в BAT-файле пишут %%i, а в CMD — %i?
В BAT-файле одиночный % используется для параметров скрипта (%1, %2). Чтобы обозначить переменную цикла FOR, нужен двойной %%. В интерактивной строке CMD параметры скрипта недоступны, поэтому достаточно одиночного %.
Как выполнить несколько команд внутри FOR за одну итерацию?
Используйте CALL :метка %%f с вынесенной подпрограммой, или объединяйте команды через &: DO (ECHO %%f & COPY "%%f" D:\backup). Скобки обязательны при нескольких командах в одном DO.
Как пропустить заголовочную строку при чтении CSV?
Используйте параметр skip=1: FOR /F "skip=1 tokens=1,2 delims=," %%a IN (data.csv) DO .... Первая строка будет проигнорирована.
Можно ли вложить один FOR в другой?
Да, вложенные циклы поддерживаются. Используйте разные буквы переменных (%%i и %%j). При обращении к внешней переменной внутри вложенного блока может потребоваться SETLOCAL ENABLEDELAYEDEXPANSION.
Как получить только имя файла без пути и расширения внутри FOR?
Используйте модификаторы переменной: %%~nf — имя без расширения, %%~xf — только расширение, %%~pf — только путь, %%~nxf — имя с расширением. Пример: FOR %%f IN (*.txt) DO ECHO %%~nf.
Аналог FOR в PowerShell?
В PowerShell используйте foreach ($item in $collection) { ... } или Get-ChildItem | ForEach-Object { ... }. Для числовых диапазонов: 1..10 | ForEach-Object { Write-Host $_ }.


