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

Обновлено: 05.07.2024

Одной из особенностей последних версий Windows 10 является способность поддерживать себя в чистоте, автоматически удаляя ставшие ненужными по истечении определённого срока файлы. В более ранних версиях системы, в которых эта функция ещё не реализована, для удаления старых файлов можно использовать командную строку, консоль PowerShell и даже Проводник, хотя процедура очистки с помощью последнего не так удобна.

Рассмотрим все три варианта.

Удаление старых файлов с помощью Проводника

Лента Проводника Windows 10 и 8.1 содержит инструмент, который позволяет отсортировать все файлы в каталоге по дате изменения, типу, размеру и некоторым другим свойствам. Допустим, вы хотите удалить файлы старше одного месяца. Зайдите в папку с залежавшимися в ней файлам и нажмите на клавиатуре F3 . При этом вы будете переключены в ленте Проводника в раздел поиска.

Кликните по иконке "Дата изменения" и выберите в выпадающем списке нужный период времени, в данном случае месяц.

Проводник - Дата изменения

Удаление старых файлов в командной строке

Для удаления файлов с "истёкшим сроком годности" мы будем использовать консольную утилиту ForFiles.exe , отвечающую за выбор объекта и выполнение с ним указанного действия. Утилита поддерживает несколько параметров, а именно:

• /S — позволяет выполнять рекурсивный поиск.
• /P — указывает путь к разделу или каталогу.
• /D — указывает количество дней с момента последней модификации.
• /C — задаёт команду действия над файлом.

В команде ForFiles также можно указывать возвращающие различные значения переменные, например, @file , которая возвращает имя файла и которую мы будем использовать. Удалим для примера все файлы старше 10 дней в папке "Картинки", лежащей в корне системного диска.

Открываем командную строку и выполняем такую команду:

В примере используются три ключа /p (путь) , /s (рекурсия) и /d (количество дней) , а также команда удаления del и переменная имени файла @file . Как только мы нажмём ввод , ForFiles пробежится по всему содержимому папки "Картинки", включая вложенные каталоги и удалит все файлы старше 10 дней .

Консольная утилита ForFiles.exe

Как видите, этот способ более эффективный и быстрый, кроме того, вы можете его автоматизировать, создав для него задания в Планировщике.

Удаление старых файлов с помощью PowerShell

Здесь практически всё то же самое, что и в примере с командной строкой, разве что синтаксис иной. Предположим, что ни путь к папке с файлами, ни цели у нас не изменились. Запускаем консоль PowerShell и выполняем команду такого вида:

PowerShell - Get-ChildItem

Результат будет аналогичным предыдущему.

Обратите внимание, что в команде также используется рекурсия (-Recurse) и указание даты в днях AddDays(-10).


Для того, что бы через powershell удалить файлы старше даты сначала нужно установить дату, которая нам нужна:

Можно дату задать несколькими днями назад. Это удобно для скриптов, которые будут все время висеть в планировщике:

Навигация по статье

На моем примере дата получится в таком формате:


Получение списка файлов для последующего удаления в Powershell

Далее нам нужно использовать Get-Childitem для того что бы получить все файлы:

У файла есть несколько свойств c датами (datetime). Все их увидеть можно так:


  • CreationTime
  • CreationTimeUtc
  • LastAccessTime
  • LastAccessTimeUtc
  • LastWriteTime
  • LastWriteTimeUtc

UTC значит, что дата будет в формате всемирного времени.

Удаление через powershell файлов старше даты

Меня интересует удаление файлов по дате создания. Для этого сделаем так:

Т.е. для каждого файла где свойство CreationDate (дата создания файла) LessThen (больше чем) дата в переменной произвести удаление. Таким образом мы удалили в powershell файлы старше определенной даты. Мы можем использовать и другие операторы сравнения:

С рекурсивным обходом папок

Powershell удаление файлов старше n дней : 1 комментарий

gci ‘E:IIS Logs’ -Directory | gci -Include ‘*.log’,’*.blg’ -Recurse | ? LastWriteTime -lt (Get-Date).AddDays(-30) | Remove-Item

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.


Если внутри корпоративной сети используются всевозможные сетевые ресурсы доступные множеству пользователей и выполняющие функции файлообменников, например сетевые папки или каталоги FTP серверов, то иногда может возникнуть необходимость в обслуживании таких ресурсов, например периодического удаления файлов и подкаталогов имеющих определённый срок давности. Хочу поделиться маленьким примером когда-то найденного (уже не вспомню где) 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:

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

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

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

Конфигурация компьютера
Процессор: AMD Phenom X4 810
Материнская плата: Gigabyte MA785GMT UD2H
Память: Kingston 2*2Gb DDR3-1333 at Dual Chanel
HDD: 2*Seagate 1500Gb SATA II NCQ 32mb
Видеокарта: Gigabyte ATI4880
Звук: int AC97
Блок питания: FSP 400PNF 400w
CD/DVD: Nec 3110a->4111a
Монитор: Samsung 961BW Wide
ОС: Win XP SP3 Update Pack Corp VL Rus\win7 RTM
Индекс производительности Windows: 5.9

Привет народ.
Powershell только начал изучать, просьба покритиковать код и самое интересное для меня-
сделать тоже самое другими способами на powershell(есть ли другие варианты)

Скрипт удаляет файлы старше определенной даты.

  1. Нет проверки, что объект - папка
  2. На удаление не попадут скрытые файлы
  3. Может не удалить файлы в которых есть символы, которые воспринимаются иначе, без параметра -LiteralPath. Через pipeline - это пофиксено.

PS > Get-ChildItem D:\2\

Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

5. Привести $deadline к типу datetime

Конфигурация компьютера
Процессор: AMD Phenom X4 810
Материнская плата: Gigabyte MA785GMT UD2H
Память: Kingston 2*2Gb DDR3-1333 at Dual Chanel
HDD: 2*Seagate 1500Gb SATA II NCQ 32mb
Видеокарта: Gigabyte ATI4880
Звук: int AC97
Блок питания: FSP 400PNF 400w
CD/DVD: Nec 3110a->4111a
Монитор: Samsung 961BW Wide
ОС: Win XP SP3 Update Pack Corp VL Rus\win7 RTM
Индекс производительности Windows: 5.9

А у меня вываливалась такая ошибка, когда я указывал дату в виде 01.11.2014, а когда указал 11/01/2014 все заработало.

так как проверить? -File ?

почему точка (Get-ChildItem $path1 -File -Force).Where
Как извлечь атрибут с помощью точки я понимаю, а вот команда where через точку для меня пока взрыв мозга.

ЗЫ. Спасибо за помощь, но может есть другие варианты кода для данной задачи, например без ForEach-Object ?
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата. Я сам придумаю скрипт, просто может для данной задачи есть более эффективные способы.

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