FORFILES — пакетная обработка файлов по дате и маске в CMD

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". Это выведет список файлов без их удаления — безопасный способ проверить фильтр.

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

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