FOR — циклы в CMD: синтаксис, ключи и практические примеры

FOR — CMD-команда для организации циклов. Перебирает файлы, строки, числа и вывод команд. Основа автоматизации в BAT-скриптах Windows.

Команда FOR организует циклическую обработку в CMD: перебирает файлы по маске, строки текста, числовые диапазоны и вывод других команд. Без FOR невозможно написать сколько-нибудь серьёзный BAT-скрипт — это главный инструмент автоматизации в командной строке Windows.

Синтаксис команды 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 $_ }.

Оцените статью
( Пока оценок нет )
MW10
Добавить комментарий

Нажимая на кнопку "Отправить комментарий", я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.