Справка по команде forfiles и ее параметрам. Команды forfiles

Синтаксис

FORFILES {dd.MM.yyyy | dd}]

Параметры

P < путь > Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)

/M < маска_поиска > Поиск файлов с помощью маски. Маска поиска по умолчанию "*"

/S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"

/C < команда >
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды:

Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 0xHH (например, 0x09 для табуляции, 0x22 - двойная кавычка). Перед внутренними командами CMD.exe необходимо ставить "cmd /c".

/D < дата > Выбор файлов, у которых дата последнего изменения больше или равна (+) либо меньше или равна (-) указанной дате при использовании формата "dd.MM.yyyy"; либо файлов, у которых дата последнего изменения больше или равна (+) текущей дате плюс "dd" дней либо меньше или равна (-) текущей дате минус "dd" дней. Допустимым числом дней "dd" является любое число в диапазоне 0 - 32768. "+" используется по умолчанию, если знак не указан.

/? или -? Вывод справки по использованию

Замечания по использованию FORFILES

На что хотелось бы сразу обратить внимание.
Параметр P - это именно путь к обрабатываемым файлам. И нельзя здесь писать по привычке заодно и маску файлов, например /p с:\tmp\*.tmp. Это неправильно! Для маски файлов существует отдельный параметр - M.
И это еще можно было бы понять, если бы в параметре M можно было бы перечислить несколько масок. Так нет же...
И раз уж речь зашла о масках - переменная @ext содержит расширение выбранного файла и может быть использована для обработки.

Примеры использования FORFILES

В простых случаях использование FORFILES дает мало преимуществ по сравнению с командой dir .

FORFILES /P C:\ /S /M *.bat

В следующем примере будут выведены все поддиректории, начиная с определенной в параметре P.

FORFILES /p C:\111 /s /c "CMD /C if @ISDIR==TRUE echo @FILE is a folder"

Учитывая некоторую... нестандартность параметров команды FORFILES, на мой взгляд, в простых случаях лучше использовать команду dir . По крайней мере, привычнее.

Наиболее часто используемый случай для команды FORFILES- удаление (реже - копирование, перемещение) файлов старше определенной даты.

FORFILES /D 01.01.2013 /C "cmd /c del @path /q"

Так же просто решается задача обработки файлов, старше определенного количества дней.

FORFILES /D -30 /C "cmd /c move @path c:\arhiv\"


В приведенном выше примере все файлы текущей папки дата создания (изменения) которых больше 30 дней переносятся в архив.

Как вариант - обработка файлов с текущей датой создания (изменения).

FORFILES /D %DATE% /C "cmd /c echo @fname is new today"

Следующая популярная область применения FORFILES - обработка файлов в зависимости от их размера.

FORFILES /P c:\ /S /C "cmd /c if @fsize GTR 10000000 echo @path"


Не бесполезный пример. Позволяет провести аудит диска на предмет наличия "больших" файлов.
И еще один пример - поиск "маленьких" файлов, как вариант - нулевой длины.

FORFILES /P "%USERPROFILE%\Local Settings\Temporary Internet Files\Content.IE5" /S /C "cmd /c if @isdir==FALSE if @fsize == 0 del @path /q"


В приведенном выше примере использования FORFILES из папок временных файлов Internet Explorer удаляются файлы нулевой длины.
Если вы пользуетесь этим браузером и редко чистите кэш, то таких ненужных файлов там немало.
На основе предыдущих примеров использования FORFILES без труда можно написать пример очистки и от "старых" файлов, но корректнее это делать соответствующей оснасткой.

В качестве исполняемой команды допустимо использовать внешний bat файл, которому FORFILES может передавать параметры.
Так, в следующем примере для файлов с текущей датой создания (изменения) вызывается bat файл 1.bat, которому в качестве параметра передается имя файла. Т. е. 1.bat будет вызван столько раз, сколько найдется файлов, удовлетворяющих условию.

FORFILES /D %DATE% /C "cmd /c 1.bat @file"


Несмотря на то, что такое использование может значительно расширять возможности FORFILES, использовать такой прием следует с осторожностью, так как это может значительно увеличить время обработки.

Несколько экзотический пример использование FORFILES. Просто показать возможности этой команды.

2>nul FORFILES /M qq.txt /C "cmd /c echo 0x07"

Если в папке присутствует файл qq.txt, то будет подан звуковой сигнал.
(В рамках этого проекта есть отдельная страница, посвященная звукам в bat (cmd) файлах .) Конструкция 2>nul предназначена для подавления вывода сообщения об ошибке в случае, если такого файла нет в папке. (Подробнее об этом - ).
Этот же пример можно записать еще более экзотически.

FORFILES /M *.txt /C "cmd /c if @fname==0x22qq0x22 echo 0x07"

Мы рассмотрели примеры использования FORFILES.
На мой взгляд, несмотря на некоторую необычность параметров, эта команда стоит того, что бы уделить ей внимание.

Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).


Иногда ошибки CMD.EXE и другие системные ошибки EXE могут быть связаны с проблемами в реестре Windows. Несколько программ может использовать файл CMD.EXE, но когда эти программы удалены или изменены, иногда остаются "осиротевшие" (ошибочные) записи реестра EXE.

В принципе, это означает, что в то время как фактическая путь к файлу мог быть изменен, его неправильное бывшее расположение до сих пор записано в реестре Windows. Когда Windows пытается найти файл по этой некорректной ссылке (на расположение файлов на вашем компьютере), может возникнуть ошибка CMD.EXE. Кроме того, заражение вредоносным ПО могло повредить записи реестра, связанные с MSDN disc 11. Таким образом, эти поврежденные записи реестра EXE необходимо исправить, чтобы устранить проблему в корне.

Редактирование реестра Windows вручную с целью удаления содержащих ошибки ключей CMD.EXE не рекомендуется, если вы не являетесь специалистом по обслуживанию ПК. Ошибки, допущенные при редактировании реестра, могут привести к неработоспособности вашего ПК и нанести непоправимый ущерб вашей операционной системе. На самом деле, даже одна запятая, поставленная не в том месте, может воспрепятствовать загрузке компьютера!

В связи с подобным риском мы настоятельно рекомендуем использовать надежные инструменты очистки реестра, такие как %%product%% (разработанный Microsoft Gold Certified Partner), чтобы просканировать и исправить любые проблемы, связанные с CMD.EXE. Используя очистку реестра , вы сможете автоматизировать процесс поиска поврежденных записей реестра, ссылок на отсутствующие файлы (например, вызывающих ошибку CMD.EXE) и нерабочих ссылок внутри реестра. Перед каждым сканированием автоматически создается резервная копия, позволяющая отменить любые изменения одним кликом и защищающая вас от возможного повреждения компьютера. Самое приятное, что устранение ошибок реестра может резко повысить скорость и производительность системы.


Предупреждение: Если вы не являетесь опытным пользователем ПК, мы НЕ рекомендуем редактирование реестра Windows вручную. Некорректное использование Редактора реестра может привести к серьезным проблемам и потребовать переустановки Windows. Мы не гарантируем, что неполадки, являющиеся результатом неправильного использования Редактора реестра, могут быть устранены. Вы пользуетесь Редактором реестра на свой страх и риск.

Перед тем, как вручную восстанавливать реестр Windows, необходимо создать резервную копию, экспортировав часть реестра, связанную с CMD.EXE (например, MSDN disc 11):

  1. Нажмите на кнопку Начать .
  2. Введите "command " в строке поиска... ПОКА НЕ НАЖИМАЙТЕ ENTER !
  3. Удерживая клавиши CTRL-Shift на клавиатуре, нажмите ENTER .
  4. Будет выведено диалоговое окно для доступа.
  5. Нажмите Да .
  6. Черный ящик открывается мигающим курсором.
  7. Введите "regedit " и нажмите ENTER .
  8. В Редакторе реестра выберите ключ, связанный с CMD.EXE (например, MSDN disc 11), для которого требуется создать резервную копию.
  9. В меню Файл выберите Экспорт .
  10. В списке Сохранить в выберите папку, в которую вы хотите сохранить резервную копию ключа MSDN disc 11.
  11. В поле Имя файла введите название файла резервной копии, например "MSDN disc 11 резервная копия".
  12. Убедитесь, что в поле Диапазон экспорта выбрано значение Выбранная ветвь .
  13. Нажмите Сохранить .
  14. Файл будет сохранен с расширением.reg .
  15. Теперь у вас есть резервная копия записи реестра, связанной с CMD.EXE.

Следующие шаги при ручном редактировании реестра не будут описаны в данной статье, так как с большой вероятностью могут привести к повреждению вашей системы. Если вы хотите получить больше информации о редактировании реестра вручную, пожалуйста, ознакомьтесь со ссылками ниже.

Делаю бекапы каждый день, накапливается не один десяток гигабайт информации. Чистить нужно, тем более старые бекапчики особой важности не несут. Раньше удалял вручную, но потом задумался… Вручную делать это лень, тем более можешь завтыкать, протупить и удалить не то. Короче, ленивый сделает лучше всех — нужно автоматизировать.

Воспользовался встроенной утилитой forfiles . Теперь все делает планировщик задач и несложный bat-ник в две строки. Пример дальше.

Команды forfiles. Примеры

Вот так примерно выглядит команда для отображения всех файлов с расширением.rar на диске С старше 10-ти дней:
forfiles /p C:\ /m *.rar /s /d -10 /c «cmd /c echo @path»

Разберем ключи по порядку:

/p — пусть для проверки. В примере диск C:\
/m — маска для поиска. Можно не задавать, если хотим убрать все файлы в папке. В примере все архивы с расширением.rar
/s — сканируем вложенные папки в том числе.
/d — дата. Можно задать в формате dd.mm.yyyy или dd. У нас -10 дней, можно указать +N дней. Про +N дней читайте далее.
/c — команда. Ключевое что нам нужно — собственно что мы будем делать с файлами. В командах также можно использовать переменные:
@path — показывает полный путь к файлу и его имя.
@relpath — показывает путь к файлу только в сканируемой папке.
@file — имя файла полностью с расширением.
@fname — только имя файла, без расширения.
@ext — только расширение имени файла.
@isdir — проверка типа файла — папка или файл. Возвращает true, если папка, и false для файлов.
@fsize — возвращает размер файла в байтах.
@fdate — возвращает дату последнего изменения файла.
@ftime — возвращает время последнего изменения файла.

Также результаты исполнения скрипта можно записать в файл.

Пример использования forfiles — отобразить все файлы.zip на диске и записать их в файл

Следующий код отобразит все Ваши исполняемые файлы.exe:
forfiles /p C:\ /m *.exe /s /c «cmd /c echo @path»

Если нужно их записать в файл, то добавьте в конце знак БОЛЬШЕ и адрес куда сохранить файл (лучше всего прописать полный путь).
forfiles /p C:\ /m *.exe /s /c «cmd /c echo @path» > D:\all_exefiles.txt

Вставляем код в cmd:

Результат — созданный файл на диске D:\ и его содержимое (можно много интересного найти):


Пример forfiles с переменными путь, дата, размер

Давайте вызовем все наши файлы с диска D:\ с расширением.zip, а выведем их на экран с адресом, датой и размером файла. Используем скрипт:

forfiles /p D:\ /m *.zip /s /c «cmd /c echo @path изменен @fdate и размером @fsize байт »

Вот результат выполнения скрипта:


Как удалить файлы старше 10 дней

Чаще всего forfiles используют как раз для задачи удаления устаревших файлов. Вот Вам cmd скрипт для удаления старых файлов (в примере старше 10 дней):
forfiles /p C:\ /m *.rar /s /d -10 /c «cmd /c del @path /q»

Как удалить папки старше 7 дней с помощью forfiles

Кроме самих файлов не лишним будет удалять и папки, тем более если они будут пустые (без файлов). Код:
forfiles /p C:\downloads /s /d -7 /c «cmd /c rmdir /s del @path /q»
В этом примере я написал уже 7 дней. Для удаления папок мы используем rmdir, ключ /s — для сканирования вложенных папок, del — команда удаления, /q — удаление без подтверждения.