Forfiles

Автор: Admin | 18.10.2013

Forfiles - консольная утилита Windows для операций с файлами, которая уже присутствует в стандартной поставке в Windows7 и WS2008R2. Позволяет производить поиск по маске и\или возрасту и применять действия к найденным файлам.

Например, данная команда найдет и удалит все файлы по маске *.log старше месяца:

forfiles /P D:\logs /S /D 30 /M *.log /С "cmd /C del @file" >> log.txt

Где:

/P D:\logs - путь
/S - рекурсивно
/D 30 - по дате, старше 30 дней
/M *.log - маска поиска
/С cmd - вызов командной строки
/C del - вызов команды удалить
@file - возвращает имена найденных файлов
>> log.txt - перенаправить вывод команды в лог файл

Можно сохранить как батник и запихать в крон планировщик задач.

Пара примеров:
Удалить файлы в каталогах по маске .svn по пути D:\project\, оставив сами каталоги:

forfiles /P D:\project\ /S /M .svn -c "cmd /c del /S @file"

Удалить непустые каталоги по маске .svn со всем содержимым:

forfiles /P D:\project\ /S /M .svn -c "cmd /c rmdir /S @file"

Справка по использованию:

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 +18.10.2013 /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"

Если выдает такую ошибку (для разных языков):

ОШИБКА: Неправильный параметр или аргумент - '/С'.
ERROR: Invalid syntax. Value expected for '/C'.

Значит параметр /C не срабатывает, помогает замена на , как сделано в паре примеров.
Как выяснилось, в WS2003R2 (предполагаю что на WXP тоже) срабатывают оба параметра, а в WS2008R2 и W7 только .

Привелось удалять логи из каталога c:\ProgramData\Path и на выполнение действия для каждого вложенного каталога просил подтверждения. Параметра /f - force для forfiles нет. Пришлось сделать так:

echo Y | forfiles /P c:\ProgramData\Path /S /D -21 /c "cmd /c del /s @file"

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *