Автоматическая очистка директорий с использованием PowerShell (полная версия)

В рамках автоматизации процессов написал скрипт, который рекурсивно удаляет файлы из директорий по дате. В нашем окружении скрипт будет использоваться для автоочистки директории с ежедневными резервными копиями баз данных с SQL сервера.

Алгоритм работы скрипта и подробности:

  1. Запуск раз в неделю, заданием в Windows.
  2. При каждом запуске составляется список файлов, которые будут удалены на следующей неделе (при следующем запуске).
  3. Отчёт посылается на почту.
  4. Далее фактически удаляются файлы, которые были в отчёте неделю назад.

По умолчанию: Хранение 45 дней. предупреждение 52 дня.

PowerShell используется по следующим причинам:

  1. Нормальная работа с DFS шарами.
  2. Возможность подписи скриптов (повышение безопасности в корпоративной среде).

Сам скрипт на PowerShell:

# ==============================================================================================
# 
# Microsoft PowerShell Source File -- Created with SAPIEN Technologies PrimalScript 2011
# 
# NAME: SQL_Monthly_cleanup
# 
# AUTHOR: Shpak Andrey , ashpak at ashpak.ru
# DATE  : 03.07.2012
# 
# COMMENT: Скрипт для автоочистки каталога с ежедневными резервными копиями SQL сервера.
# Запускается раз в неделю. 
# В предыдущую неделю генерирует список файлов для удаления и шлёт их на почту админу.
# Фактически файлы удаляются через неделю.
# 
# ==============================================================================================
 
# Задаём общие переменные для всей работы
 
$Path_Daily_Backup="\\dp.internal\IT\Backups 1C databases of SRV-SQL1\Backups\Daily\"
$Backupsdatewarn = 52  
#Время для цикла предупреждения
$Backupsdate = 45 
# Время хранения
$today = Get-Date -Format "dd-MM-yyyy"
$lastmonth = Get-Date -Format "dd-MM-yyyy" (Get-Date).Adddays(-35)
$tempfile = "$env:windir\logs\tempfile.txt" 
# Временный файл для генерации лога на почту
 
# Генерируем список удаляемых файлов следующей недели.
 
Start-Transcript $tempfile
Get-ChildItem -Path $Path_Daily_Backup | where {$_.lastwritetime -le ((get-date).AddDays(-$Backupsdatewarn))} | Remove-Item -WhatIf
Stop-Transcript
 
#Задаём параметры почтового сервера, адрес получателя, адрес отправителя.
 
$EmailFrom = "<mail>"
$EmailTo = "<mail>"
$EmailSubject = "Removing next week:"
$smtpServer = "<mail server>"
$smtpUsername = "<mail username>"
$smtpPassword = "<mail password>"
 
#Конвертируем открытый пароль в тот, который скушает PS
 
$secstr = New-Object -TypeName System.Security.SecureString
$smtpPassword.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$EmailCred = new-object -typename System.Management.Automation.PSCredential -argumentlist $smtpUsername, $secstr
 
#Генирируем и отправляем письмо.
 
Send-MailMessage -To $EmailTo -From $EmailFrom -Subject $EmailSubject -Priority High -SmtpServer $smtpServer -Credential $EmailCred -Body "Carefully read attachment!" -Attachments $tempfile
 
# Удаляем старый лог (35 дней) и временный лог
Remove-Item $tempfile
Remove-Item $env:windir\logs\autocleanup_$lastmonth.log
 
# Фактически удаляем файлы, согласно маске предыдущей недели, записываем всё в лог!. 
Start-Transcript $env:windir\logs\autocleanup_$today.log
Get-ChildItem -Path $Path_Daily_Backup -Recurse | where {$_.lastwritetime -le ((get-date).AddDays(-$Backupsdate))} | Remove-Item -Verbose
Stop-Transcript

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *