Необходимость автоматизации определенных задач —
одна из главных причин, заставляющих нас применять инструменты командной
строки, не имеющие графического пользовательского интерфейса. Часто
главное затруднение заключается не в поиске подходящих команд для
выполнения той или иной задачи, а в том, что для автоматизации действия
требуется владение языком сценариев типа PowerShell или VBScript. Можно
было бы вспомнить команду For, которая, по существу, позволяет создавать
сценарий без использования языка создания сценариев. Она дает
возможность применять некоторые команды для последовательности файлов и
папок. Теперь рассмотрим похожий инструмент — Forfiles, который в
определенной степени превосходит команду For. Forfiles наконец включена в
стандартную установку Windows Vista, при том что она входила в пакет
Resource Kit начиная с Windows 98.
Необычный синтаксис
К
синтаксису команды Forfiles привыкнуть сложно, но инструмент настолько
полезен, что на многое можно закрыть глаза. В основном Forfiles находит
последовательность папок для файлов и папок, соответствующих
определенным критериям, например все файлы с расширением .exe в папке
C:myfiles (включая ее подкаталоги), в которые вносились изменения в
течение последних десяти дней. Для файлов или папок, обнаруженных
Forfiles, этот инструмент создает переменные с такими именами, как
@file, @ext, @path и т.д., в которых хранится определенная информация
(например, имя папки или файла, его расширение, полная спецификация
файла, его размер, является ли объект файлом или папкой, дата или время
последнего исправления). Forfiles имеет ключи, с помощью которых
задаются действия над папками или файлами.
Основных ключей в
Forfiles пять. Первый,/p (путь), задает для Forfiles область поиска,
например /p C: или /p C:datafiles. Чтобы Forfiles показывала все файлы в
папке с именем E: datafiles, надо ввести
forfiles/p E:datafiles
Это
задание не демонстрирует особую ценность данной команды, поскольку ту
же задачу выполняет команда Dir E:datafiles. Это пример неудачного
синтаксиса Forfiles.
Другое задание — как использовать Forfiles,
чтобы показать файлы с именами, которые начинаются с буквы t?
Естественно было бы предположить, что надо ввести в командной строке
Windows команду:
forfiles/p E:datafiles *
Однако эта
команда не сработает, потому что ключ /p в Forfiles предназначен только
для указания пути. Чтобы использовать групповой символ для фильтрации
файлов и папок, задаваемых этим ключом, надо добавить ключ /m, который
задает маску, или трафарет, для Forfiles. Непонятно, зачем понадобилось
так усложнять знакомый и простой способ задавать путь с групповыми
символами.
Третий ключ, /s (для подкаталогов), употребляется без
параметров. Как в случае многих других инструментов командной строки
Windows, этот ключ Forfiles задает поиск не только для заданного пути,
но и во всех его подкаталогах.
Ключ /d (дата) позволяет выделять
файлы по значению измененной даты. Для выполнения задания включать
только файлы, измененные n дней назад, надо добавить ключ с параметром:
/d -n, где n — число от 0 до 32767. Таким образом, чтобы увидеть файлы
из папки E:datafiles, измененные три дня назад, следует ввести команду
forfiles/p E:datafiles/d –3
Можно
также ввести ключ /d с параметром, задающим для отображения файлы,
измененные до или после определенной даты. Если ввести этот ключ с
параметром даты в формате +mm/dd/yyyy, можно выделить файлы, измененные
после указанной даты; ввод /d –mm/dd/yyyy покажет файлы, измененные до
этой даты. Например, чтобы показать файлы, в которых последнее изменение
было 1 июня 2006 г. или до этой даты, надо ввести в командной строке
forfiles /p E:datafiles /d –06/01/2006
Последний
ключ Forfiles/c (команда) указывает, что необходимо сделать с
найденными файлами и папками. Если этот ключ не задавать, Forfiles
просто покажет, какие файлы были обнаружены. Однако ключ /c позволит
сделать значительно больше, но об этом — в следующий раз.
Итак,
For — прекрасная команда, и в определенных случаях ею пользоваться
проще, чем командой Forfiles. Однако с помощью Forfiles легче выделять
файлы и папки, удовлетворяющие заданным критериям, включая критерии
размера файла и даты изменения. Более того, Forfiles позволяет просто
задавать команды, позволяющие манипулировать только частью имени файла.
Несомненно, Forfiles станет замечательным дополнением к вашему набору
инструментов.
СинтаксисМестонахождение
%systemroot%\system32
Описание
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 C:\WINDOWS /S /M DNS*.*
FORFILES /S /M *.txt /C "cmd /c type @file | more"
FORFILES /P C:\ /S /M *.bat
FORFILES /D -30 /M *.exe
/C "cmd /c echo @path 0x09 был изменен 30 дней назад"
FORFILES /D 01.01.2001
/C "cmd /c echo @fname является новым с 1-янв-2001"
FORFILES /D +13.6.2011 /C "cmd /c echo @fname является новым сегодня"
FORFILES /M *.exe /D +1
FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"
Удаление временных файлов по расписанию
Источник: Удаление временных файлов скриптом по расписанию | Вадим Стеркин
Создаем cmd-файл
forfiles.exe /p %temp% /s /m *.* /d -14 /c "cmd /c del /q /f @file"
Вместо %temp% (временной папки в профиле) подставьте свою папку (параметр /p)
Возраст файлов по умолчанию 14 дней (параметр /d), но вы можете задать любое значение
Можно удалять файлы определенного расширения по маске (например, /m *.log)
За рекурсивное удаление (во вложенных папках) отвечает параметр /s
Конечно, в скрипте вы можете использовать несколько команд, каждая из которых будет удалять заданную папку.
Для выполнения очистки папки по расписанию нужно создать скрипт с
именем cleanup.cmd, и скопировать его в папку %windir%\system32.
Задание в планировщике создается одной командой:
Schtasks.exe /Create /RL Highest /TN CleanUP /SC Weekly /D SUN /ST 14:00 /TR "%WINDIR%\system32\cleanup.cmd"
Задание с именем CleanUp будет выполняться:
- с наивысшими правами (параметр /RL)
- раз в неделю (параметр /SC)
- по воскресеньям (параметр /D)
- в 14:00 (параметр /ST)
Откройте Пуск – Поиск – Планировщик заданий и вы увидите в библиотеке планировщика задание CleanUp.
Можете проверить работу задания в планировщике. Для этого щелкните правой кнопкой мыши по заданию и выберите Выполнить.