В рамках автоматизации процессов написал скрипт, который рекурсивно удаляет файлы из директорий по дате. В нашем окружении скрипт будет использоваться для автоочистки директории с ежедневными резервными копиями баз данных с SQL сервера.
Алгоритм работы скрипта и подробности:
- Запуск раз в неделю, заданием в Windows.
- При каждом запуске составляется список файлов, которые будут удалены на следующей неделе (при следующем запуске).
- Отчёт посылается на почту.
- Далее фактически удаляются файлы, которые были в отчёте неделю назад.
По умолчанию: Хранение 45 дней. предупреждение 52 дня.
PowerShell используется по следующим причинам:
- Нормальная работа с DFS шарами.
- Возможность подписи скриптов (повышение безопасности в корпоративной среде).
Сам скрипт на 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