Продолжим работу с инструментом групповой обработки файлов без применения сценариев. Получив основное представление о команде Forfiles (forfiles.exe), можно выполнять рутинные задания. В первой статье цикла, «Forfiles: групповая обработка файлов без сценариев», опубликованной в Windows IT Pro/RE № 3 за 2009 г., мы рассмотрели четыре наиболее важных ключа Forfiles: ключ/p задает папки (путь) для поиска; ключ/m определяет имена файлов в указанном пути; ключ/s дает подкаталоги; и, наконец, ключ /d позволяет сузить область поиска Forfiles по дате последней модификации. Таким образом, команда

forfiles/p C:windows/m *.exe

показывает все файлы с расширением .exe в папке C:windows. Добавление ключа/s задает поиск в каталоге C:windows и всех его подкаталогах файлов .exe. В Windows Vista более 19 тыс. подкаталогов, поэтому стоит все взвесить, прежде чем запускать эту команду. Наконец, ключ/d –100 еще более сужает область поиска, ограничивая ее только теми файлами, которые менялись в течение последних 100 дней. Начнем изучение Forfiles с этими четырьмя параметрами.

Другие ключи Forfiles

Очень важный ключ/c команды Forfiles позволяет выполнять действия над найденными файлами. Для каждого файла, удовлетворяющего заданному критерию, Forfiles сохраняет информацию во встроенных переменных, имена которых начинаются с символа @ и содержат: имя файла (@file), расширение (@ext), имя без расширения (@fname), полную спецификацию файла (@path), дату и время последней модификации (@fdate и @ftime), размер в байтах (@fsize), статус — файл или папка (@isdir). Эти переменные можно использовать для построения команды, которая выполняет необходимую операцию над выбранными файлами (например — вывести на экран, удалить, передвинуть).

Команда Forfiles/c по умолчанию означает следующее:

/c "cmd/c echo @file"

и просто отображает на дисплее имена файлов. В этом смысле Forfiles — несколько усиленная версия команды Dir. Однако с ней можно сделать больше, подставляя свои ключи/c. Например, чтобы исключить все файлы журналов с расширением .log в текущей папке, надо ввести команду

forfiles/m *.log/c "cmd/c del @file"

Эта функциональность не очень интересна, к тому же команда Del всегда задействует подстановочные символы. А что делать, если надо уничтожить только те файлы журналов, длина которых более одного миллиона байтов? Для этого можно ввести команду

forfiles/m *.log/c "cmd/c IF @fsize GEQ 1000000
(del @file)"

Этот пример показывает, как команда IF усиливает возможности Forfiles. Windows содержит команду IF, которая позволяет сравнивать строки или числа, используя операторы сравнения EQU (равно), NEQ (не равно), LSS (меньше), LEQ (меньше или равно), GTR (больше) и GEQ (больше или равно). Команда IF становится еще более мощной в сочетании с ELSE. Предположим, нам надо уничтожить все файлы журналов размером свыше миллиона байтов и переместить остальные файлы в папку C:logarchives для архивирования файлов журналов. Для этого введем команду

forfiles/m *.log/c "cmd/c IF @fsize GEQ 1000000
(del @file) ELSE (move @file c:logarchives)"

Несколько замечаний о синтаксисе. Во-первых, командная информация, которая следует за ключом /c, должна быть между двойными кавычками. Во-вторых, при использовании IF и ELSE рекомендуется заключать в скобки условие IF и условие ELSE, чтобы легче было воспринимать, что надо делать. Приведу простой пример. Предположим, надо создать простой список всех файлов в текущей папке, причем так, чтобы каждая строка содержала имя одного файла и пометку о том, что размер файла больше или меньше мегабайта. Команда выглядит так:

forfiles/m *.log/c "cmd/c if @fsize GEQ 1000000
(echo @file is a million bytes or larger.)
ELSE (echo @file is under a million bytes in size.)"

Сложный поиск

Возможности Forfiles в отношении поиска по дате и времени изменения и по размерам файла в сочетании с операторами IF/ELSE позволяют применить эту команду для реализации функций расширенного поиска, которую предлагал Windows Explorer в прежних версиях Windows.