Автоматизация процесса удаления старых файлов из определенных каталогов в 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.
странно на момент написания скрипта все отрабатывало нормально. Как сейчас не могу сказать надо тестировать.
Спасибо Вам!
Не за что 🙂