FORFILES

Команда 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 для кода символа табуляции).

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

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

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

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

FORFILES - отобразить список файлов текущего каталога. Команда с параметрами по умолчанию аналогична команде:

forfiles /P . /M * /C "cmd /c echo @file"

Допускается использование записей –p вместо /p - forfiles -P . -M * -C "cmd /c echo @file"

forfiles /M *.exe /C "cmd /c echo @file" | more - отобразить список файлов текущего каталога с расширением .exe в постраничном режиме вывода на экран.

forfiles /M *.exe /C "cmd /c echo @file" > list_exe.txt - то же, что и в предыдущем примере, но с выдачей результатов в текстовый файл list_exe.txt текущего каталога.

forfiles /P C:\windows\system32 /M *.exe /D +01.09.2014 /C "cmd /c echo @file" - отобразить список файлов программ ( /M *.exe ) из системного каталога Windows (/P C:\windows\system32 ) изменившихся после 01.09.2014 года.

forfiles /P C:\windows\system32 /M *.exe /D -01.09.2014 /C "cmd /c echo @file" - отобразить список файлов программ ( /M *.exe ) из системного каталога Windows (/P C:\windows\system32 ) изменившихся 01.09.2014 года или ранее.

forfiles /P %TEMP% /M *.* /D 0 /C "cmd /c echo @file размер - @fsize" - отобразить имена и размеры всех файлов из каталога временных файлов, изменившихся сегодня.

forfiles /P %TEMP% /M *.log /D -3 /C "cmd /c if @isdir==FALSE notepad.exe @file" - открыть в блокноте файлы с расширением .log из каталога временных файлов, изменившиеся за последние 3 дня.

FORFILES /S /P %USERPROFILE%\Documents\ /M *.doc* /D +01.08.2014 /C "cmd /c echo @path изменен @fdate @ftime" - отобразить список документов в папке "Документы" и ее подкаталогах в профиле текущего пользователя, которые были изменены после 1 августа 2014 года. Отображается полные пути и имена файлов, дата и время их изменения. Пример результата выполнения команды в среде Windows 7:
 

"C:\Users\USER1\Documents\classguids.docx" изменен 19.08.2014 16:09:04
"C:\Users\USER1\Documents\hardware.docx" изменен 19.08.2014 12:38:31
"C:\Users\USER1\Documents\forfiles.doc" изменен 01.09.2014 20:22:07
"C:\Users\USER1\Documents\Список файлов.docx" изменен 18.08.2014 23:56:50
. . .


FORFILES /S /P %TEMP% /M *.exe /C "cmd /c echo @path изменен @fdate" > tmp_exe_files.txt - вывести в текстовый файл tmp_exe_files.txt список всех исполняемых файлов из каталога временных файлов текущего пользователя и его подкаталогов. Выводится полный путь, имя и время изменения, например:
 

"C:\Users\USER1\AppData\Local\Temp\Firefox Setup 31.0.exe" изменен 22.07.2014
"C:\Users\USER1\AppData\Local\Temp\ICReinstall_Firefox Setup 31.0.exe" изменен 22.07.2014
"C:\Users\USER1\AppData\Local\Temp\TeamViewer\Version9\TeamViewer_.exe" изменен 02.07.2014
"C:\Users\USER1\AppData\Local\Temp\Temp1_DR_Vista_WL167g.zip\Vista\Driver\x64\Setup.exe" изменен 16.10.2008
"C:\Users\USER1\AppData\Local\Temp\Temp1_Dr_WL_167g_Win7.zip\Driver\x64\AutoInstall.exe" изменен 23.11.2009

Синтаксис

FORFILES [/P <путь>] [/M <маска_поиска>] [/S] [/C <команда>] [/D [+ | -] {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, то будет подан звуковой сигнал.
Конструкция 2>nul предназначена для подавления вывода сообщения об ошибке в случае, если такого файла нет в папке. (Подробнее об этом - здесь).
Этот же пример можно записать еще более экзотически.

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


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

Категория: Команды | Добавил: masterov (12.11.2017) | Автор: Андрей Мастеров E W
Просмотров: 29 | Теги: команды Windows, Синтаксис | Рейтинг: 0.0/0
Другие материалы по теме:
Всего комментариев: 0
avatar