Автоматизация процесса удаления старых файлов из определенных каталогов в Windows системах, с помощью скрипта для PowerShell.
В процессе рабочей необходимости, мне понадобился инструмент который будет выполнять функцию клинера старых файлов, в определенных каталогах. Имеется множество уже готовых инструментов, но я решил написать свой скрипт для PowerShell.
Задача скрипта:
- В заданных каталогах производить поиск файлов подходящих по критерий давности
- Дополнительная функция поиска файлов по заданной маске
- Удалять найденные файлы
- Выполнять чистку пустых каталогов, если таковые образовались после удаления старых файлов.
Ниже представлен листинг получившегося у меня скрипта. Скрипт с комментариями, разобраться в нем не должно составить труда.
[stextbox id=’warning’]По-умолчанию в PowerShell включена максимальная политика безопасности, которая позволяет выполнять команды PowerShell в командной строке, но не позволяет в той же командной строке выполнить скрипт с командами PowerShell.
Разрешить выполнение скриптов в Powershell:
powershell -Command Set-ExecutionPolicy RemoteSigned[/stextbox]
# Переменные для работы скрипта # # Путь к сетевой папке, в который хранить бекапы $Path_Mikrotik = "\\192.168.1.3\IT\Backup\Mikrotik" # Удалять файлы старше ... дней $StoreBackup_Period=14 # Функция удаления файлов и папок Function RemoveFilesFolders ($Path,$CountDays) { # Определяем порог крайней даты $GetLastDate = (Get-Date).AddDays(-$CountDays) # Сканируем указанную папку на наличие файлов $Scan = Get-Childitem $Path -Recurse -Force | Where{$_.LastWriteTime -le "$GetLastDate"} # Циклом проходимся по каждому найденному файлу, попадающего под критерий давности Foreach ($File in $Scan){ # Проверка, что файл находится на месте. if ($File -ne $NULL) { # Удаляем файл Remove-Item $File.FullName -Recurse | Out-Null } } # Подчищаем после чистки, удаляем пустые каталоги, если таковые есть Get-ChildItem $Path -Recurse -Force | Where-Object {$_.PSIsContainer -eq $true} | % {if((Get-ChildItem -Path $_.FullName -Recurse -Force | Measure-Object -Property Length -Sum).sum -eq $null) {Remove-Item $_.FullName -Recurse}} } # Функция удаления файлов по маске Function RemoveFilesByMaskFolders ($Path,$Extention,$CountDays) { # Определяем порог крайней даты $GetLastDate = (Get-Date).AddDays(-$CountDays) # Сканируем указанную папку на наличие файлов $Scan = Get-Childitem $Path -Include $Extension -Recurse | Where{$_.LastWriteTime -le "$GetLastDate"} # Циклом проходимся по каждому найденному файлу, попадающего под критерий давности Foreach ($File in $Scan){ # Проверка, что файл находится на месте. if ($File -ne $NULL) { # Удаляем файл Remove-Item $File.FullName -Recurse | Out-Null } } # Подчищаем после чистки, удаляем пустые каталоги, если таковые есть Get-ChildItem $Path -Recurse -Force | Where-Object {$_.PSIsContainer -eq $true} | % {if((Get-ChildItem -Path $_.FullName -Recurse -Force | Measure-Object -Property Length -Sum).sum -eq $null) {Remove-Item $_.FullName -Recurse}} } # Удаляем старые архивы бекапа в папке RemoveFilesFolders $Path_Mikrotik $StoreBackup_Period # Удаляем старые архивы бекапа в папке RemoveFilesByMaskFolders $Path_Mikrotik "*.rsc" $StoreBackup_Period
Небольшие комментарии по скрипту. Пользоваться скриптом просто, т.к. обработка поиска и удаления файлов, описаны в функциях, то для того чтобы выполнить очистку от старых файлов в определенной папке, достаточно выполнить:
- RemoveFilesFolders {Путь к каталогу} {Порог крайней даты} — Базовый поиск и очистка. Для удобства в скрипте путь и порог крайней даты, можно задать в переменные и указать их в команде в качестве переменных.
- RemoveFilesFolders {Путь к каталогу} {Маска файлов} {Порог крайней даты} — Для поиска и очистке файлов по их маске. Так же можно задать в переменные и указать их в команде в качестве переменных.
Данный скрипт можно ставить в планировщик и быть спокойным что в ваших хранилищах не будут накапливаться тонны старых файлов.
Понравилась или оказалась полезной статья, поблагодари автора
В скрипте ошибка: параметр Extention переходит в переменную Extension.
странно на момент написания скрипта все отрабатывало нормально. Как сейчас не могу сказать надо тестировать.
Спасибо Вам!
Не за что 🙂