Как вы знаете создание резервных копий является не отъемлемой частью работы системного администратора. О важности создания архивных копий я думаю рассказывать не нужно. Используя современные средства мы с вами напишем не большой скрипт на Powershell для архивации баз 1С по расписанию.
Функционал скрипта архивирования баз 1С:
- Архивирование баз 1С в ZIP
- Удаление старых архивов
- Запись логов в файл
- Отправка отчета архивации на почту администратору
Для создания zip архива можно использовать класс ZipFile из .NET Framework 4.5 или использовать любой консольный архиватор который может создавать zip архивы. Мой выбор пал на консольный архиватор 7zip, в данной статье мы будем использовать его для архивации баз 1С.
Первое что сделаем – это напишем функцию отправки сообщения на email администратору. Как отправить письмо с помощью Powershell я писал в одной из своих статей ( Powershell отправка почты с авторизацией через SMTP сервер Яндекса ).
# Функция отправки сообщения на почту
function sendMail
{
param([string]$content)
$serverSmtp = "smtp.yandex.ru"
$port = 587
$From = "адрес отправителя@yandex.ru"
$To = "Кому@mail.ru"
$subject = "Архивирование баз 1С"
$user = "адрес отправителя"
$pass = "Пароль"
$mes = New-Object System.Net.Mail.MailMessage
$mes.From = $from
$mes.To.Add($to)
$mes.Subject = $subject
$mes.IsBodyHTML = $true
$title = "<h1>Архивирование баз 1С компании ООО Рога и Копыта</h1>"
$list = "<ul>"+ $content +"</ul>"
$mes.Body = $title +' '+ $list
$smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port)
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
$smtp.Send($mes)
}
Далее опишем функцию для удаления не нужных архивов. В данной функции вы можете указать глубину архива ваших резервных копий. Данная функция поможет сэкономить пространство на жестком диске.
# Функция удаления старых архивов
function removeFolder
{
param($backupFolder)
# Указываем глубину архива 10 дней
$days = "-10"
$removeDateFolder = $date.AddDays($days)
# Удаляем старые файлы превышающие 10 дней
Get-ChildItem -Path $backupFolder | `
Where-Object { $_.LastWriteTime -lt $removeDateFolder } | `
Remove-Item -Recurse
}
Пишем вспомогательную функцию для создания каталогов, для удобства именовать каталоги будем текущей датой. Так мы сможем быстрей находить нужный нам архив для восстановления.
# Функция создания нового каталога
function createFolder
{
param(
$folder,
$newFolder
)
# Если папка с текущей датой не создана, то создаем ее
if(!(Test-Path $folder$newFolder))
{
New-Item -Path $folder -Name $newFolder -ItemType directory
}
}
Определяем переменные с каталогами. Указываем путь где находятся базы 1С, а также каталоги куда будем складывать архивы и логи.
# Путь к папке источнику, то что нужно архивировать
$sourceFolder = "C:\base\"
# Папка для хронения резервных копий
$backupFolder = "C:\backup\"
# Папка для хронения логов
$backupLog = "C:\backupLog\"
Получаем текущую дату для именования новых каталогов.
# Получаем текущую дату в нужном формате для наименования папки
$date = Get-Date
$dateFolder = Get-Date -DisplayHint Date -Format d.M.yyyy
Указываем путь до консольного архиватора 7zip .
# Путь к консольному архиватору 7zip
$7zip = "C:\Program Files\7-Zip\7z.exe"
Бывает так, что баз в каталоге очень много и указывать каждую в скрипте мягко говоря не правильно. По этому мы прочитаем содержимой папки с базами и в цикле пробежимся по ним.
# Список каталогов для архивации из папки источника
$folderBase = Get-ChildItem -Path $sourceFolder
# Перебираем в цикли каталоги для архивации
for($i = 0; $i -lt $folderBase.Name.Count; $i++)
{
# Если папка не одна
if($folderBase.Name -is [array])
{
# Имя архива
$fileName = $folderBase.Name[$i]
}
else
{
# Имя архива
$fileName = $folderBase.Name
}
# Собираем список каталогов которые архивируем
$list += "<li>" + $fileName + "</li>"
# Создаем нужные каталоги
createFolder $backupFolder $dateFolder
createFolder $backupLog $dateFolder
# Создаем архив каталога с базой и записываем LOG
&$7zip a -tzip -r $sourceFolder$fileName.zip $sourceFolder$fileName >> $backupLog$dateFolder\$fileName.txt
# Перемещаем только что созданный каталог в папку для архивов
# Если такой архив уже есть, то перезаписываем его
Move-Item -Path $sourceFolder$fileName.zip -Destination $backupFolder$dateFolder -Force
}
После создания архива, проверяем есть ли старые файлы в нашем каталоге с резервными копиями попадающими под фильтр на удаление.
# Удаляем старые каталоги превышающие 10 дней
removeFolder $backupFolder
Далее отправляем отчет на электронную почту администратора и удаляем переменные.
# Отправляем письмо с отчетом на почту админу
sendMail $list
# Удаляем переменные
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
Вот собственно и все, теперь осталось собрать все воедино, создать в планировщике задачу на исполнение данного скрипта по расписанию.
<#
Проект: Архивация баз 1С
Версия: 1.0
Описание: Создание архивных копий баз 1С Предприятия,
а также отправка отчета на почту администратора отчета
об архивации данных.
Автор: bezramok-tlt.ru
Сайт: https://bezramok-tlt.ru/
#>
# Функция отправки сообщения на почту
function sendMail
{
param([string]$content)
$serverSmtp = "smtp.yandex.ru"
$port = 587
$From = "адрес отправителя@yandex.ru"
$To = "Кому@mail.ru"
$subject = "Архивирование баз 1С"
$user = "адрес отправителя"
$pass = "Пароль"
$mes = New-Object System.Net.Mail.MailMessage
$mes.From = $from
$mes.To.Add($to)
$mes.Subject = $subject
$mes.IsBodyHTML = $true
$title = "<h1>Архивирование баз 1С компании ООО Рога и Копыта</h1>"
$list = "<ul>"+ $content +"</ul>"
$mes.Body = $title +' '+ $list
$smtp = New-Object Net.Mail.SmtpClient($serverSmtp, $port)
$smtp.EnableSSL = $true
$smtp.Credentials = New-Object System.Net.NetworkCredential($user, $pass);
$smtp.Send($mes)
}
# Функция удаления старых архивов
function removeFolder
{
param($backupFolder)
# Указываем глубину архива 10 дней
$days = "-10"
$removeDateFolder = $date.AddDays($days)
# Удаляем старые файлы превышающие 10 дней
Get-ChildItem -Path $backupFolder | `
Where-Object { $_.LastWriteTime -lt $removeDateFolder } | `
Remove-Item -Recurse
}
# Функция создания нового каталога
function createFolder
{
param(
$folder,
$newFolder
)
# Если папка с текущей датой не создана, то создаем ее
if(!(Test-Path $folder$newFolder))
{
New-Item -Path $folder -Name $newFolder -ItemType directory
}
}
# Путь к папке источнику, то что нужно архивировать
$sourceFolder = "C:\base\"
# Папка для хронения резервных копий
$backupFolder = "C:\backup\"
# Папка для хронения логов
$backupLog = "C:\backupLog\"
# Получаем текущую дату в нужном формате для наименования папки
$date = Get-Date
$dateFolder = Get-Date -DisplayHint Date -Format d.M.yyyy
# Путь к консольному архиватору 7zip
$7zip = "C:\Program Files\7-Zip\7z.exe"
# Список каталогов для архивации из папки источника
$folderBase = Get-ChildItem -Path $sourceFolder
# Перебираем в цикли каталоги для архивации
for($i = 0; $i -lt $folderBase.Name.Count; $i++)
{
# Если папка не одна
if($folderBase.Name -is [array])
{
# Имя архива
$fileName = $folderBase.Name[$i]
}
else
{
# Имя архива
$fileName = $folderBase.Name
}
# Собираем список каталогов которые архивируем
$list += "<li>" + $fileName + "</li>"
# Создаем нужные каталоги
createFolder $backupFolder $dateFolder
createFolder $backupLog $dateFolder
# Создаем архив каталога с базой и записываем LOG
&$7zip a -tzip -r $sourceFolder$fileName.zip $sourceFolder$fileName >> $backupLog$dateFolder\$fileName.txt
# Перемещаем только что созданный каталог в папку для архивов
# Если такой архив уже есть, то перезаписываем его
Move-Item -Path $sourceFolder$fileName.zip -Destination $backupFolder$dateFolder -Force
}
# Удаляем старые каталоги превышающие 10 дней
removeFolder $backupFolder
# Отправляем письмо с отчетом на почту админу
sendMail $list
# Удаляем переменные
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue
29/08/2017 10:37:45