FORFILES
Синтаксис
FORFILES [/P <путь>] [/M <маска_поиска>] [/S] [/C <команда>] [/D [+ | -] {dd.MM.yyyy | dd}]Параметры
P < путь > Путь, с которого начинается поиск. По умолчанию используется текущая рабочая папка (.)/M < маска_поиска > Поиск файлов с помощью маски. Маска поиска по умолчанию "*"
/S Рекурсивное выполнение программы forfiles во всех подпапках, аналогично "DIR /S"
/C < команда >
Команда, которая выполняется для каждого файла. Строки команд необходимо заключать в прямые кавычки. Команда по умолчанию "cmd /c echo @file". Следующие переменные могут использоваться в строке команды:
@file | Возвращает имя файла |
@fname | Возвращает имя файла без расширения |
@ext | Возвращает только расширение имени файла |
@path | Возвращает полный путь к файлу |
@relpath | Возвращает относительный путь к файлу |
@isdir | Возвращает значение "TRUE", если типом файла является папка, и "FALSE" для файлов |
@fsize | Возвращает размер файла в байтах |
@fdate | Возвращает дату последнего изменения файла |
@ftime | Возвращает время последнего изменения файла |
Для включения специальных символов в строку команды следует использовать шестнадцатеричный код символа в формате 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.
На мой взгляд, несмотря на некоторую необычность параметров, эта команда стоит того, что бы уделить ей внимание.
Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).
Новый раздел о средствах командной строки в рамках этого же проекта расположен здесь