SCROLL
Среднее время на прочтение: 1 мин.

Автоматизация процесса удаления старых файлов из определенных каталогов в 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 {Путь к каталогу} {Маска файлов} {Порог крайней даты} — Для поиска и очистке файлов по их маске. Так же можно задать в переменные и указать их в команде в качестве переменных.

Данный скрипт можно ставить в планировщик и быть спокойным что в ваших хранилищах не будут накапливаться тонны старых файлов.

 

Понравилась или оказалась полезной статья, поблагодари автора

 

Обсуждение

4 комментариев
  • В скрипте ошибка: параметр Extention переходит в переменную Extension.

    • Это ответ на комментарий Иван

      странно на момент написания скрипта все отрабатывало нормально. Как сейчас не могу сказать надо тестировать.