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 дней .
Как видите, этот способ более эффективный и быстрый, кроме того, вы можете его автоматизировать, создав для него задания в Планировщике.
Удаление старых файлов с помощью PowerShell
Здесь практически всё то же самое, что и в примере с командной строкой, разве что синтаксис иной. Предположим, что ни путь к папке с файлами, ни цели у нас не изменились. Запускаем консоль PowerShell и выполняем команду такого вида:
Результат будет аналогичным предыдущему.
Обратите внимание, что в команде также используется рекурсия (-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(есть ли другие варианты)
Скрипт удаляет файлы старше определенной даты.
- Нет проверки, что объект - папка
- На удаление не попадут скрытые файлы
- Может не удалить файлы в которых есть символы, которые воспринимаются иначе, без параметра -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 ?
И еще задача боевая, хочу поставить скрипт на мониторинг файлопомойки, каждую пятницу скрипт будет проверять размер папки, и если больше определенного размера удалять файлы и папки старше чем определенная дата. Я сам придумаю скрипт, просто может для данной задачи есть более эффективные способы.
Читайте также: