В рамках автоматизации процессов написал скрипт, который рекурсивно удаляет файлы из директорий по дате. В нашем окружении скрипт будет использоваться для автоочистки директории с ежедневными резервными копиями баз данных с 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