Cmd удалить файлы старше n дней в windows

Обновлено: 01.07.2024

Иногда в Windows возникает необходимость удалить файлы определённого типа старше какого-то времени. Это можно сделать не прибегая к помощи сторонних утилит. Необходимо всего лишь выполнить запрос в командной строке.
Вот так, например, у меня автоматически удаляются записи с камер видеонаблюдения старше 30 дней:

D: cd D:Videocam0 forfiles /p "D:Videocam0" /M *.mp4 /S /D -30 /C "cmd /c del /f /a /q @file"

Эти строки записаны в bat-файл, который автоматически вызывается из планировщика.

Удаление файлов через cmd утилитой forfiles.exe

Пример как с ее помощью можно удалять бекапы старше 20 дней:

forfiles.exe /p С:Backup /s /m *.* /d -20 /c «cmd /c del /q /f @file»

обычный батник — и вуаля само делает неинтересную работу..

справка по FORFILES

FORFILES [/P ] [/M ] [/S]

Выбор файла (или набора файлов) и выполнение команды

с этим файлом. Программа полезна для пакетных заданий.

/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 необходимо ставить

/D Выбор файлов, у которых дата последнего изменения

больше или равна (+) либо меньше или равна

(-) указанной дате при использовании формата

«dd.MM.yyyy»; либо файлов, у которых дата последнего

изменения больше или равна (+)

текущей дате плюс «dd» дней либо меньше или

равна (-) текущей дате минус «dd» дней.

Допустимым числом дней «dd» является любое

число в диапазоне 0 — 32768.

«+» используется по умолчанию, если знак не указан.

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

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 +25.1.2011 /C «cmd /c echo @fname является новым сегодня»

FORFILES /M *.exe /D +1

FORFILES /S /M *.doc /C «cmd /c echo @fsize»


Иногда надо сделать удаление файлов старше n дней. Например Backup’ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.

Содержание:

1. Скрипт удаления файлов старше n-дней

2. Создание задания в планировщике задач

Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:

Где:
F:ackup — путь, в какой папке мы будем с вами искать файлы для удаления
*.* — имя (маска) файлов
/d -30 — старше скольки дней нам необходимо удалить файлы.

Вот так это выглядит в PowerShell:


Осталось только его выполнить и все.

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

Итак, что нам для этого надо?

Для начала идем в «Пуск -> панель управления -> Администрирование» и запускаем там «Планировщик заданий«.


Выбираем пункт «Создать задачу«:


На вкладке «Общие» задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.


Далее переходим на вкладку «Триггеры» и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.


Далее идем на вкладку «Действия» и задаем действие, которое будет выполняться. Выбираем «Запуск программы»

программу или сценарий

и указываем путь до PowerShell:

А аргументе указываем путь до нашего скрипта, который мы создали ранее:

Нажимаем «Ок» и еще раз «Ок»

Все, на этом наше задание создано. Осталось дождаться, когда будет выполнено наше действие по расписанию и проверить, все ли правильно было настроено.

Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.

Иногда надо сделать удаление файлов старше n дней. Например Backup’ ы. Можно делать это вручную, отсортировать их по дате и удалить, а можно воспользоваться скриптом. В данном примере мы рассмотрим скрипт для удаления файлов старше n дней и добавим задание в планировщик Windows Server 2012R2.

Содержание:

1. Скрипт удаления файлов старше n-дней

2. Создание задания в планировщике задач

Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:

Где:
F:\backup\ - путь, в какой папке мы будем с вами искать файлы для удаления *.* - имя (маска) файлов /d -30 - старше скольки дней нам необходимо удалить файлы.

Вот так это выглядит в PowerShell:

удаление


Осталось только его выполнить и все.


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

Итак, что нам для этого надо?

Для начала идем в "Пуск -> панель управления -> Администрирование" и запускаем там "Планировщик заданий".


Выбираем пункт "Создать задачу":


На вкладке "Общие" задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.


Далее переходим на вкладку "Триггеры" и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.


Далее идем на вкладку "Действия" и задаем действие, которое будет выполняться. Выбираем "Запуск программы"

программу или сценарий

и указываем путь до PowerShell:

А аргументе указываем путь до нашего скрипта, который мы создали ранее:

Нажимаем "Ок" и еще раз "Ок"

Все, на этом наше задание создано. Осталось дождаться, когда будет выполнено наше действие по расписанию и проверить, все ли правильно было настроено.

Я ищу способ удалить все файлы старше 7 дней в пакетном файле. Я искал в Интернете и нашел несколько примеров с сотнями строк кода, а другие, которые требовали установки дополнительных утилит командной строки для выполнения этой задачи.

Подобные вещи можно сделать в BASH всего за пару строк кода. Кажется, что-то хотя бы удаленно можно сделать для пакетных файлов в Windows. Я ищу решение, которое работает в стандартной командной строке Windows, без каких-либо дополнительных утилит. Пожалуйста, не PowerShell или Cygwin либо.

gehrcke.de/timegaps был разработан для этой цели. Он даже допускает более сложную схему удаления: помимо хранения файлов за последние 7 дней, например, он также позволяет хранить один файл для каждой из последних 8 недель, 12 месяцев, 2 лет.

Смотрите forfiles документацию для более подробной информации.

Если вы не forfiles установили его на свой компьютер, скопируйте его с любого Windows Server 2003 на компьютер с Windows XP по адресу %WinDir%\system32\ . Это возможно, поскольку EXE-файл полностью совместим с Windows Server 2003 и Windows XP.

Более поздние версии Windows и Windows Server устанавливают его по умолчанию.

Для Windows 7 и новее (включая Windows 10):

Синтаксис немного изменился. Поэтому обновленная команда:

Должно быть del @FILE, дело имеет значение. Также я предлагаю использовать / c echo @FILE для тестирования @Russell: @PATH - полный путь, включая имя. @FILE - это только имя, поэтому, если вы имеете дело с подпапками, оно не будет работать. Обратите внимание, что если вы хотите, чтобы файлы были старше 10 дней, вам нужно указать -d "-10". -ve означает «старше, чем», + ve означает «новее, чем». Вы также можете указать формат DDMMYY или -DDMMYY в качестве параметра -d. Я использовал этот синтаксис на Win Server 2008: forfiles / P "C: \ Mysql_backup" / S / M * .sql / D -30 / C "cmd / c del @PATH" Этот ответ работает, когда «старше 7 дней» определено как «изменено более 7 дней назад», а не «создано более 7 дней назад». Как можно достичь последнего?

Переместите все файлы (используя / mov, который перемещает файлы, а затем удаляет их, в отличие от / move, который перемещает целые деревья файлов, которые затем удаляются), через robocopy в другое место, а затем выполните команду удаления по этому пути, и вы все хорошо.

Также, если у вас есть каталог с большим количеством данных, вы можете использовать /mir переключатель

@ adamb0mb это ни в коем случае нецелесообразно - если «destination» находится в той же файловой системе, что и «source» , операция перемещения довольно легкая. Поскольку robocopy действительно надежен, он на самом деле будет работать для любого размера каталога, скрытых имен файлов, в основном произвольной длины пути и включать каталоги, если вам это нужно - то, чего наверняка нельзя сказать о многих других утилитах Windows. Я бы использовал rd /s /q c:\destination вместо del команды, хотя или даже использовать другой robocopy /mir c:\emptydir c:\destination запуск, чтобы очистить каталог, если вы ожидаете проблемы с именами файлов. Кроме того, robocopy поддерживает UNC-пути - что forfiles из принятого ответа не подойдет. Мои мысли были более схожими: «Мои файлы уже там, где я хочу их. Я не хочу их перемещать». «Удаление файлов - это логически то, что вы делаете, так что делайте это. Не перегружайте Robocopy, чтобы сделать это» Я рекомендую этот однострочник для просмотра всех файлов C:\test старше 7 дней. Чтобы удалить файлы, изменить echo на del : forfiles /p "C:\test" /m "*.*" /c "cmd /c echo @file" /D -7

Ok немного соскучился и придумал это, которое содержит мою версию замены эпохи Linux для бедного человека, ограниченную для ежедневного использования (без сохранения времени):

ПРИМЕНЕНИЕ

set /a strip=day*7 : Измените 7 на количество дней, чтобы сохранить.

set dSource=C:\temp : Это начальный каталог для проверки файлов.

Это неразрушающий код, он будет отображать то, что случилось бы.

поэтому файлы на самом деле удаляются

эпоха : я не принял во внимание время, так как необходимо удалить файлы старше определенной даты, так как часы / минуты удалили бы файлы со дня, который предназначался для хранения.

ОГРАНИЧЕНИЕ

Эпоха считает само собой разумеющимся, ваш короткий формат даты ГГГГ-ММ-ДД. Его необходимо адаптировать для других настроек или оценки времени выполнения (прочитайте sShortTime, пользовательскую конфигурацию, настройте правильный порядок полей в фильтре и используйте фильтр для извлечения правильных данных из аргумента).

Я упоминал, что ненавижу автоформатирование этого редактора? он удаляет пустые строки, а копирование-вставка - ад.

Надеюсь, это поможет.

+1 за неразрушающий код, я постараюсь учесть это, когда приведу примеры кода сам. Уже поздно и совершенно не связано, но 7daysclean.cmd звучит как удивительное название для группы Synth-Punk.

Вы должны сделать /d -3 (3 дня назад) Это прекрасно работает для меня. Таким образом, все сложные партии могут быть в мусорном ведре. Также forfiles не поддерживаются пути UNC, поэтому установите сетевое соединение с конкретным диском.

Та же ошибка, что и в других ответах (в том числе принятых). Откуда появилась эта странная привычка уточнения *.* ? Подстановочный знак *.* не соответствует всем файлам в Windows. Он соответствует только файлам с . их именами. ОП никогда не говорил ничего о требовании . в имени файла. Правильный параметр есть /M * , но это все равно по умолчанию. Там нет необходимости /M вообще. @AnT: ты уверен? Я думаю, *.* ведет себя точно так же, как * в Windows. Фактически, я только что попробовал это на своем компьютере, и dir *.* действительно перечислил test file , файл без расширения. @ Андреас Рейбранд: Я тоже нахожу это удивительным, но трактовка *.* противоречит, скажем, dir и -m варианту forfiles . -m *.* Маска действительно пропустить extensionless имена файлов, как я уже говорил в моем комментарии выше (попробуйте сами). Самое смешное в том, что в документации MS явно указано, что -m *.* это по умолчанию. Однако, если вы попробуете это в реальной жизни, вы увидите, что по умолчанию на самом деле -m * - все файлы повторяются.

Это удаляет файлы старше указанной даты. Я уверен, что это может быть изменено, чтобы вернуться на семь дней от текущей даты.

обновление: я заметил, что HerbCSO улучшил вышеупомянутый сценарий. Я рекомендую использовать его версию вместо.

@PATH - это просто путь в моем случае, поэтому мне пришлось использовать @PATH\@FILE

тоже forfiles /? не работает для меня тоже, но forfiles (без "?") работал нормально.

И единственный вопрос, который у меня есть: как добавить несколько масок (например, « .log | .bak»)?

Все это в отношении forfiles.exe, которое я скачал здесь (на win XP)

Но если вы используете сервер Windows, forfiles.exe уже должен быть, и он отличается от версии ftp. Вот почему я должен изменить команду.

Для Windows Server 2003 я использую эту команду:

Часто есть относительные вопросы, связанные с датой и временем, которые нужно решить с помощью командного файла. Но интерпретатор командной строки cmd.exe не имеет функции для вычисления даты / времени. Множество хороших рабочих решений, использующих дополнительные консольные приложения или скрипты, уже размещены здесь, на других страницах Stack Overflow и на других веб-сайтах.

Общим для операций, основанных на дате / времени, является требование преобразования строки даты / времени в секунды с определенного дня. Очень часто встречается 1970-01-01 00:00:00 UTC. Но любой последующий день также может быть использован в зависимости от диапазона дат, необходимого для поддержки конкретной задачи.

Джей опубликовал 7daysclean.cmd, содержащий быстрое решение «дата-секунды» для интерпретатора командной строки cmd.exe . Но это не учитывает правильных високосных лет. JR опубликовал дополнение для учета високосного дня в текущем году, но игнорирует другие високосные годы с базового года, то есть с 1970 года.

Уже более 20 лет я использую статические таблицы (массивы), созданные один раз с небольшой функцией C, для быстрого получения количества дней, включая високосные дни, с 1970-01-01 в функциях преобразования даты / времени в моих приложениях, написанных на C / C ++.

Этот очень быстрый табличный метод может быть использован также в пакетном коде с использованием команды FOR . Поэтому я решил закодировать пакетную подпрограмму, GetSeconds которая вычисляет количество секунд с 1970-01-01 00:00:00 UTC для строки даты / времени, переданной этой подпрограмме.

Примечание. Дополнительные секунды не учитываются, поскольку файловые системы Windows также не поддерживают дополнительные секунды.

Дни с 1970-01-01 00:00:00 UTC для каждого года, включая високосные дни.

Вычисление секунд для года с 2039 по 2106 с началом эпохи 1970-01-01 возможно только с использованием 32-разрядной переменной без знака, то есть без знака long (или без знака int) в C / C ++.

Информация о високосном году (нет / да) за период с 1970 по 2106 гг.

Количество дней до первого дня каждого месяца в текущем году.

Преобразование даты в число секунд с 1970-01-01 довольно легко с помощью этих таблиц.

Внимание, пожалуйста!

Формат строк даты и времени зависит от региона Windows и языковых настроек. Разделители и порядок маркеров , присвоенных переменных среды Day , Month и Year в первом ДЛЯ цикле GetSeconds должна быть адаптирована к местным формата даты / времени , если это необходимо.

Необходимо адаптировать строку даты переменной среды, если формат даты в переменной среды DATE отличается от формата даты, используемого командой FOR on %%

Например , когда %DATE% расширяется в Sun 02/08/2015 то время как %%

tF раскрывается в 02/08/2015 07:38 PM коде ниже может быть использован с модификации линии 4:

Это приводит к простой передаче подпрограммы 02/08/2015 - строки даты без трех букв сокращения дня недели и символа разделяющего пробела.

В качестве альтернативы можно использовать следующую для передачи текущей даты в правильном формате:

Теперь последние 10 символов из строки даты передаются в функцию, GetSeconds и поэтому не имеет значения, является ли строка даты переменной среды DATE с или без дня недели, если день и месяц всегда имеют 2 цифры в ожидаемом порядке, то есть в формате dd/mm/yyyy или dd.mm.yyyy .

Вот код пакета с поясняющими комментариями, который просто выводит, какой файл удалить и какой файл хранить в C:\Temp дереве папок, см. Код первого цикла FOR .

Для оптимальной производительности лучше всего удалить все комментарии, то есть все строки, начинающиеся с rem после 0-4 пробелов.

Далее код партии ниже оптимизирован для 24-часового формата времени.

Более подробную информацию о форматах даты и времени и сравнениях времени файлов в Windows см. В моем ответе « Узнайте, если файл старше 4 часов в пакетном файле, с большим количеством дополнительной информации о времени файла».

Подскажите пожалуйста, как реализовать следующую задачу:
Есть сетевое хранилище. В нем куча папок. В данный момент интересуют 5 из них.
4 папки используются для сканов с мфу, то есть пользователь отсканил документ, мфу его положил в свою папку(файлы могут быть как pdf так и jpg, все зависит от того как настроили при сканировании)
В этих 4-х папка не должны оставаться файлы старше 3-х дней. Отсканировал-забрал, не забрал файл удалился.
Нужно, чтоб планировщик запускал bat файл который, из указанной папки все файлы старше трех дней переносил в другую папку, затем из этой "другой папки" удалял все файлы старше 20 дней. При этом в папке могут быть созданы не только файлы с изображениями, так же там могу создать и папку, которую в свою очередь тоже нужно сначала переместить а уже потом удалить с теме же временными рамками что и у файлов. Для этого был написан вот такой батник:

FORFILES /p "W:\Scan_Buh" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Buh\""
:: Переносим все файлы и папки старше 3-х дней из папки Scan_Buh в папку EverybodyOld\Scan_Buh\
FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /D -20 /C "cmd /c del @path /f /q"
:: Удаляем все файлы старше 20-и дней из папки Scan_Buh
FORFILES /p "W:\EverybodyOld\Scan_Buh" /S /C "cmd /c rd @path"
:: Удаляем все пустые папки
FORFILES /p "W:\Scan_Manager" /S /D -3 /C "cmd /c move @path "W:\EverybodyOld\Scan_Manager\""
:: Переносим все файлы и папки старше 3-дней из папки Scan_Manager в папку EverybodyOld\Scan_Manager\
FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /D -20 /C "cmd /c del @path /f /q"
:: Удаляем все файлы старше 20-и дней из папки Scan_Manager
FORFILES /p "W:\EverybodyOld\Scan_Manager" /S /C "cmd /c rd @path"
:: Удаляем все пустые папки


Аналогично для остальных двух папок, меняется только путь к ним.

Сейчас добавилась еще одна папка. В ней идет обмен документами, а так же несколько папок с которыми работают все. Тут может быть куча самых различных фалов, папок, подпапок. Из этой папке так же нужно перемещать все файлы\папки старше n дней в другую папку, затем по истечение n дней удалять из другой папки. НО есть несколько папок (в них соответственно файлы) которые трогать не нужно. К примеру есть w:\test в ней еще папки 1,2,3,4,5,6, и просто фалы лежащие в корне(кол-во файлов и папок может быть какое угодно и с каким угодно расширением), нужно чтоб всё что старше n дней переместилось в w:\arhiv\test кроме папки и всего содержимого в папка 2, 4,5 эти папки просто должны пропускаться (у них есть имя которое не изменяется, ведется работа только внутри этих папок) а потом уже из папки w:\arhiv\test так же все что старше 20 дней удалялось и файлы и папки в том числе.

Как сделать исключение по названию папки? Чтоб при том же перемещении на определенную папку просто не обращалось внимания.
У Forfiles есть ключ /м но это маска с которой он работает и не исключает.
Все это на автомате, без каких либо запросов и ввода доп информации, задание ночью отработало и всё.
Помогите разобраться и дополнить батник, а возможно и переделать совсем и оптимизировать.

Stanley5, У Вас целый роман при описании постановки задачи
дополнить батник, а возможно и переделать совсем и оптимизировать.

Я бы предложил не копировать исходные файлы старше нужного числа дней как они есть, а архивировать в архив в один файл с именем - датой в формате yyyymmdd, с такими названиями файлы легко сортируются. При этом используя ключи winrar этого можно легко добиться. И, далее, удалять в архивной папке не файлы старше определённой даты (например, 20 дней), а оставлять нужное число архивов (например, 20 штук), что, в принципе, при ежедневном создании архивов, одно и то же. Получилось громоздко, но довольно универсально. Степень сжатия rar можно регулировать при необходимости экономии времени при работе ключом -m. В примере я взял -m1 (довольно быстрая работа). Еще быстрее -m0 без сжатия. Без указания работает уровень m3.

Процедура архивации Call :Arc_Copy вызывается для каждой архивируемой папки.
Её аргументы описаны.
При наличии исключений в аргументах этой процедуры указывается имя процедуры, где формируется текстовый файл для конкретного случая с перечислением полных имён папок (файлов) исключений.
В примере это процедуры No_JS_Host и No_test

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Скрипт на самом деле очень простой, создается в PowerShell и выглядит он следующим образом:

Где:
F:backup — путь, в какой папке мы будем с вами искать файлы для удаления
*.* — имя (маска) файлов
/d -30 — старше скольки дней нам необходимо удалить файлы.

Вот так это выглядит в PowerShell:

Осталось только его выполнить и все.

Как использовать ForFiles для удаления файлов старше X дней в Windows 10

Если у вас есть разные папки с большим количеством файлов и вы хотите очистить их, удалив те файлы, которые старше определенного количества дней, вы можете использовать команду ForFiles.

Чтобы использовать команду ForFiles для удаления файлов старше определенного количества дней, выполните следующие действия:

Разбивка команд ForFiles

Если вы хотите узнать больше об этих ключах, используйте ForFiles /? команду.

Синтаксис Syntax

Параметры Parameters

forfiles /SКоманда аналогична dir /S . The forfiles /S command is similar to dir /S.

В командной строке можно использовать следующие переменные, как указано в параметре командной строки /c : You can use the following variables in the command string as specified by the /C command-line option:

Команда forfiles позволяет выполнять команду или передавать аргументы в несколько файлов. The forfiles command lets you run a command on or pass arguments to multiple files. Например, можно выполнить команду Type для всех файлов в дереве с расширением txt. For example, you could run the type command on all files in a tree with the .txt file name extension. Или же можно выполнить каждый пакетный файл (*. bat) на диске C с именем файла Myinput.txt в качестве первого аргумента. Or you could execute every batch file (*.bat) on drive C, with the file name Myinput.txt as the first argument.

Эта команда может: This command can:

Выберите файлы в абсолютную или относительную дату с помощью параметра /d . Select files by an absolute date or a relative date by using the /d parameter.

Создайте архивное дерево файлов с помощью переменных, таких как @FSIZE и @FDATE . Build an archive tree of files by using variables such as @FSIZE and @FDATE.

С помощью переменной можно отличать файлы от каталогов @ISDIR . Differentiate files from directories by using the @ISDIR variable.

Включите специальные символы в командную строку, используя шестнадцатеричный код для символа в формате 0x чч (например, 0x09 для вкладки). Include special characters in the command line by using the hexadecimal code for the character, in 0x HH format (for example, 0x09 for a tab).

Эта команда работает путем применения recurse subdirectories флага к средствам, предназначенным для обработки только одного файла. This command works by implementing the recurse subdirectories flag on tools that are designed to process only a single file.

Примеры Examples

Чтобы вывести список всех пакетных файлов на диске C, введите: To list all of the batch files on drive C, type:

Чтобы вывести список всех каталогов на диске C, введите: To list all of the directories on drive C, type:

Чтобы получить список всех файлов в текущем каталоге, которые устарели по крайней мере один год, введите: To list all of the files in the current directory that are at least one year old, type:

Чтобы отобразить текстовый файл , устаревший для каждого из файлов в текущем каталоге, которые старше 1 января 2007, введите: To display the text file is outdated for each of the files in the current directory that are older than January 1, 2007, type:

Чтобы вывести список расширений имен файлов в текущем каталоге в формате столбца и добавить вкладку перед расширением, введите: To list the file name extensions of all the files in the current directory in column format, and add a tab before the extension, type:

Скрипты

Вы можете воспользоваться на выбор скриптами CMD, VBS и PowerShell.

Можно использовать утилиту командной строки forfiles.exe, входящую в состав Windows 7 и новее (когда-то она входила в Windows 2000 Resource Kit). Одной командой удаляются все файлы из указанной папки и вложенных в нее.

Команда для выполнения

  • Вместо %temp% (временной папки в профиле) подставьте свою папку (параметр /p)
  • Возраст файлов по умолчанию 14 дней (параметр /d), но вы можете задать любое значение
  • Можно удалять файлы определенного расширения по маске (например, /m *.log)
  • За рекурсивное удаление (во вложенных папках) отвечает параметр /s

Конечно, в скрипте вы можете использовать несколько команд, каждая из которых будет удалять заданную папку. Справка по использованию утилиты вызывается командой forfiles /?.

Приведенный ниже скрипт VBS удаляет все файлы и папки, включая защищенные, с выводом списка удаленных файлов.

  • Файлы удаляются по дате изменения. Чтобы удалять по дате создания, замените .DateLastModified на .DateCreated
  • Если не хотите удалять защищенные файлы, закомментируйте строку
    ‘ oI.Attributes = 0

Команда для выполнения

Скрипт можно запускать из командного файла (CMD).

cscript //Nologo MyCleanUp.VBS 14 %windir%temp >MyCleanupScript.Log

  • Вместо %windir%temp подставьте свою папку (в этом примере удаляются файлы из временной папки в системном каталоге)
  • Возраст файлов по умолчанию 14 дней, но вы можете задать любое значение
  • Список удаленных файлов будет по умолчанию сохранен в файле %windir%system32MyCleanupScript.Log, хотя можно указать любой путь и имя файла

Как и в случае с утилитой forefiles.exe, можно реализовать очистку различных папок, указав каждую в отдельной команде.

PowerShell

Скрипт на PowerShell был в блоге Сергея Мариничева в рамках урока об операциях с файлами, но теперь страница доступна только в архиве интернета. Я скопировал ключевое содержимое для вас:

powershell.exe -ExecutionPolicy Bypass -noprofile -file Script.ps1

Выполнение очистки по расписанию

Для выполнения очистки папки по расписанию нужно создать скрипт с именем cleanup.cmd, содержащий команду для запуска, и скопировать его в любую папку из PATH (например, %windir%system32). Поместите туда же скрипт VBS или PowerShell, если вы решили использовать его, а не утилиту forfiles.ехе.

Задание в планировщике создается одной командой:

Задание с именем CleanUp будет выполняться:

  • с наивысшими правами (параметр /RL)
  • раз в неделю (параметр /SC)
  • по воскресеньям (параметр /D)
  • в 14:00 (параметр /ST)

Откройте Пуск – Поиск – Планировщик заданий и вы увидите в библиотеке планировщика задание CleanUp.

*


Увеличить рисунок

Можете проверить работу задания в планировщике. Для этого щелкните правой кнопкой мыши по заданию и выберите Выполнить.

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

Итак, что нам для этого надо?

Для начала идем в «Пуск -> панель управления -> Администрирование» и запускаем там «Планировщик заданий«.

Выбираем пункт «Создать задачу«:

На вкладке «Общие» задаем имя задания, его описание и пользователя, от которого оно будет выполняться. По умолчанию там будет пользователь, под которым вы вошли в данный момент в систему.

Далее переходим на вкладку «Триггеры» и создаем расписание, когда мы будем запускать наше задания. У меня настроено в 10:00 каждые 2 дня.

Далее идем на вкладку «Действия» и задаем действие, которое будет выполняться. Выбираем «Запуск программы»

программу или сценарий

и указываем путь до PowerShell:

А аргументе указываем путь до нашего скрипта, который мы создали ранее:

Нажимаем «Ок» и еще раз «Ок»

Все, на этом наше задание создано. Осталось дождаться, когда будет выполнено наше действие по расписанию и проверить, все ли правильно было настроено.

Дополнительные ссылки Additional References

  • Условные обозначения синтаксиса команд командной строки Command-Line Syntax Key

Готовые файлы

Загрузите архив и распакуйте в любую папку. В архиве варианты forfiles и VBS.

  1. Задайте путь к папке и возраст файлов в скрипте CleanUp.cmd в одной из папок (каждая соответствует одному из описанных выше способов), после чего скопируйте все содержимое папки в %windir%system32.
  2. Щелкните правой кнопкой мыши на файле schedule.cmd и выберите Запуск от имени администратора, чтобы создать задание.

Благодарности

Авторами скриптов, которые я когда-то почерпнул из этой темы конференции OSZone, являются Keeper2006 и amel27 соответственно. В этой же теме вы найдете другие интересные варианты решения данной задачи, и туда же следует направлять вопросы по доработке скриптов под свои нужды.

А как вы избавляетесь от ненужных файлов – программой или скриптом? Настроена ли у вас очистка по расписанию?

Читайте также: