Команда FORFILES выполняет заданную команду поочерёдно для каждого файла, отобранного по пути, маске имени и дате изменения. Главное применение — автоматизация задач обслуживания: удаление старых логов, архивирование устаревших файлов, пакетное переименование.
- Синтаксис команды FORFILES
- Ключи и параметры
- Примеры использования
- Удаление временных файлов старше 30 дней
- Удаление логов старше недели
- Копирование новых файлов в архив
- Вывод списка файлов с датами
- Переименование файлов с добавлением суффикса
- Рекурсивный поиск в подкаталогах
- Частые ошибки и решения
- Когда применять, а когда нет
- FAQ
- Как удалить файлы старше 30 дней с помощью FORFILES?
- Почему FORFILES не находит файлы, хотя они есть в папке?
- Можно ли использовать FORFILES для обработки только папок, а не файлов?
- Как добавить FORFILES в Планировщик задач для ежедневной очистки?
- Как проверить, какие файлы удалятся, перед реальным удалением?
Синтаксис команды FORFILES
FORFILES [/P путь] [/M маска] [/S] [/C "команда"] [/D [+|-]дата]
Параметры:
/P путь— каталог поиска. По умолчанию — текущий каталог./M маска— фильтр по имени (например*.log). По умолчанию*.*./C "команда"— команда для выполнения. По умолчанию"cmd /c echo @file"./D дата— фильтр по дате последнего изменения./S— рекурсивный обход подкаталогов.
Ключи и параметры
| Ключ | Описание | Пример |
|---|---|---|
/P путь | Начальный каталог для поиска файлов | /P "C:\Logs" |
/M маска | Фильтр имён файлов, поддерживает wildcards | /M "*.tmp" |
/S | Рекурсивный поиск во всех подкаталогах | /S |
/C "команда" | Команда, выполняемая для каждого найденного файла | /C "cmd /c del @file" |
/D -N | Файлы, изменённые более N дней назад (старее N дней) | /D -30 |
/D +N | Файлы, изменённые не более N дней назад (новее N дней) | /D +7 |
/D дата | Файлы, изменённые начиная с указанной даты (формат DD.MM.YYYY) | /D 01.01.2024 |
Переменные подстановки внутри команды /C:
@file— полное имя файла в кавычках@fname— имя без расширения@ext— расширение файла@path— полный путь к файлу@fsize— размер файла в байтах@fdate— дата последнего изменения@isdir— TRUE если файл является каталогом
Примеры использования
Удаление временных файлов старше 30 дней
Регулярная очистка каталога C:\Temp от устаревших файлов .tmp, включая подкаталоги.
FORFILES /P "C:\Temp" /S /M "*.tmp" /D -30 /C "cmd /c del /q @file"
Команда удалит все .tmp-файлы, дата изменения которых старше 30 дней. Ключ /q в DEL отключает подтверждение.
Удаление логов старше недели
Автоматическая очистка папки с логами сервиса.
FORFILES /P "C:\Logs" /M "*.log" /D -7 /C "cmd /c del @file"
Будут удалены все .log-файлы с датой изменения более 7 дней назад.
Копирование новых файлов в архив
Скопировать все JPG-файлы из папки Photos в папку Backup.
FORFILES /P "C:\Photos" /M "*.jpg" /C "cmd /c copy @file D:\Backup\"
Для каждого найденного файла будет выполнена команда COPY с его именем.
Вывод списка файлов с датами
Проверить, какие файлы попадут под условие удаления, прежде чем реально удалять.
FORFILES /P "C:\Logs" /M "*.log" /D -30 /C "cmd /c echo @path @fdate"
Выведет полный путь и дату изменения каждого файла старше 30 дней — без удаления.
Переименование файлов с добавлением суффикса
Добавить суффикс _old к именам .txt-файлов, изменённых более 90 дней назад.
FORFILES /M "*.txt" /D -90 /C "cmd /c ren @file @fname_old.txt"
Каждый файл будет переименован: например, report.txt станет report_old.txt.
Рекурсивный поиск в подкаталогах
Найти все BAK-файлы во всём дереве каталогов и вывести их пути.
FORFILES /P "D:\Projects" /S /M "*.bak" /C "cmd /c echo @path"
Ключ /S заставляет FORFILES обходить все вложенные подкаталоги рекурсивно.
Частые ошибки и решения
| Ошибка / ситуация | Причина | Решение |
|---|---|---|
ERROR: No files found with the specified search criteria. | Нет файлов, соответствующих маске и дате | Проверьте маску /M и значение /D. Начните с вывода списка без /D, чтобы убедиться, что файлы есть |
| Команда в /C выполняется, но файл не удаляется | Нет прав на файл или файл занят другим процессом | Запустите CMD от имени администратора; проверьте, не открыт ли файл |
| Имя файла с пробелами вызывает ошибку в /C | @file уже включает кавычки, но команда не обрабатывает их | @file возвращает имя в кавычках автоматически. Используйте @file без дополнительных кавычек вокруг него |
| Неверный формат даты при использовании /D | Формат даты зависит от региональных настроек Windows | Используйте числовой сдвиг /D -N (количество дней) вместо конкретной даты — он не зависит от локали |
| FORFILES не обходит подкаталоги | Забыт ключ /S | Добавьте /S в команду для рекурсивного обхода |
Когда применять, а когда нет
FORFILES оптимальна для задач обслуживания файловой системы по расписанию (через Планировщик задач): удаление старых логов, ротация архивов, пакетная обработка файлов определённого возраста. Команда работает только с файловой системой и не пригодна для обработки данных внутри файлов. Если нужна более гибкая логика — ветвление, условия, сложные имена — используйте FOR в BAT-скрипте. В PowerShell аналог — Get-ChildItem | Where-Object в сочетании с ForEach-Object, что даёт гораздо больше возможностей для фильтрации. FORFILES требует прав администратора при работе с системными каталогами.
FAQ
Как удалить файлы старше 30 дней с помощью FORFILES?
Используйте ключ /D с отрицательным числом дней: FORFILES /P "путь" /M "*.log" /D -30 /C "cmd /c del @file". Число после /D — это количество дней от текущей даты.
Почему FORFILES не находит файлы, хотя они есть в папке?
Чаще всего причина — слишком строгий фильтр /D или несовпадение маски /M. Запустите команду без /D, чтобы убедиться, что файлы видны, затем добавляйте ограничения постепенно.
Можно ли использовать FORFILES для обработки только папок, а не файлов?
Да. Внутри команды /C используйте переменную @isdir: /C "cmd /c if @isdir==TRUE echo @path". Так команда выполнится только для каталогов.
Как добавить FORFILES в Планировщик задач для ежедневной очистки?
Создайте BAT-файл с нужной командой FORFILES и добавьте его запуск в Планировщик задач с нужным расписанием. Укажите запуск с правами администратора, если команда работает в системных каталогах.
Как проверить, какие файлы удалятся, перед реальным удалением?
Замените команду удаления на вывод: /C "cmd /c echo @path". Это выведет список файлов без их удаления — безопасный способ проверить фильтр.


