За основу взята данная публикация.
Скрипт позволяет провести все указанные выше операции, снабжен комментариями и, благодаря тому, что PowerShell является неотъемлемой компонентой системы начиная с Win7 (так же доступен и в более ранних ОС), может быть легко и быстро адаптирован под нужды каждого.
В данном случае приведен пример архивации одной базы и удаление ее архивов старше 60 дней. В случае аварийного завершения скрипта блокировка начала сеансов будет снята через 2 часа.
# Описание функций
function PerformBackup([string]$IBConnectionString, [string]$IBName ,[string]$User, [string]$Pass = "", [string]$BackupDirectory, [string]$ClasterUser = "", [string]$ClasterPass = "")
{
# Удалим сессии
# Аутентификация к выбранному кластеру
# если у пользователя под которым будет выполняться сценарий нет прав на кластер,
# можно прописать ниже имя пользователя и пароль администратора кластера
$ServerAgent.Authenticate($Claster, $ClasterUser, $ClasterPass)
# Получаем список сессий кластера и прерываем их
$Sessions = $ServerAgent.GetSessions($Claster)
if (!($Sessions.Count -eq 0))
{
write-host "Разрывается" $Sessions.Count "сессий базы" $InfoBaseName
foreach ($Session in $Sessions)
{
$ServerAgent.TerminateSession($Claster, $Session)
}
}
# Устанавливаем блокировку начала сеансов
write-host "Установлена блокировка начала сеансов к базе $IBName";
ChangeConnectDenied $IBName $True $User $Pass
# Создаем бэкап
write-host "Создание бэкапа базы $IBName";
$curtime = Get-Date -Format 'dd.MM.yyyy';
$arglist = "CONFIG /s """+$IBConnectionString+$IBName+""" /N """+$User+""" /P """+$Pass+""" /DisableStartupMessages /Out """+$BackupDirectory+"log_"+$curtime+".txt"" /DumpIB """+$BackupDirectory+$curtime+".dt"" /UC ""GodMode = On""";
Start-Process -wait (Get-Alias -name exe82).definition -ArgumentList $arglist;
write-host "Архив базы $IBName успешно скопирован в файл $BackupDirectory$curtime.dt";
# Снимаем блокировку начала сеансов
write-host "Блокировка начала сеансов к базе $IBName снята";
ChangeConnectDenied $IBName $False $User $Pass
}
function ChangeConnectDenied([string]$InfoBaseName, [bool]$ConnectDenied, [string]$User = "", [string]$Pass = "")
{
# Получаем список рабочих процессов кластера
$WorkingProcesses = $ServerAgent.GetWorkingProcesses($Claster)
foreach ($WorkingProcess in $WorkingProcesses)
{
if (!($WorkingProcess.Running -eq 1))
{
continue
}
$CWPAddr = "tcp://"+$WorkingProcess.HostName+":"+$WorkingProcess.MainPort
$CWP = $V82Com.ConnectWorkingProcess($CWPAddr)
$CWP.AddAuthentication($User, $Pass)
$InfoBases = $CWP.GetInfoBases()
foreach ($InfoBase in $InfoBases)
{
if ($InfoBase.Name -eq $InfoBaseName)
{
$InfoBaseFound = $TRUE
break
}
}
if (!($InfoBaseFound))
{
write-host "Не найдена указанная в параметрах запуска ИБ..."
break
}
# Устанавливаем/снимаем блокировку соединений ИБ
$InfoBase.ConnectDenied = $ConnectDenied
$InfoBase.PermissionCode = "GodMode = On";
$InfoBase.DeniedFrom = Get-Date -Format "yyyy-MM-dd HH:mm:ss";
$InfoBase.DeniedTo = (Get-Date).AddHours(2).ToString("yyyy-MM-dd HH:mm:ss") # Блокировка автоматически будет снята через 2 часа
$CWP.UpdateInfoBase($InfoBase)
}
}
function DeleteOldArchives([string]$BackupFolderPath, [int]$StorageDays)
{
$AbsStorageDays = [Math]::Abs($StorageDays)
$CurrentDate = Get-Date
$OldDate = $CurrentDate.AddDays($StorageDays)
write-host "Удаление архивов из $BackupFolderPath за последние $AbsStorageDays дней"
Get-ChildItem $BackupFolderPath | Where-Object { $_.LastWriteTime -lt $OldDate } | Remove-Item
}
#///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
# По версии стартера определяем путь к 1С последней версии (это позволяет не заморачиваться с перепиской скрипта при обновлении платформы)
if (Test-Path -path "C:\Program Files (x86)\1cv82")
{
$PathTo1C = "C:\Program Files (x86)\1cv82\";
}
else
{
$PathTo1C = "C:\Program Files\1cv82\";
}
$Version1C = (Get-Command ($PathTo1C+"common\1cestart.exe")).FileVersionInfo.FileVersion;
Set-Alias exe82 ($PathTo1C+$Version1C+"\bin\1cv8.exe");
# Параметры запуска сценария: адрес сервера, основной порт кластера, количество дней хранения архивов, путь к папке с архивами
$SrvAddr = "tcp://localhost:1540"
$MainPort = "1541"
$StorageDays = -60 # знак "-" обязателен, иначе дата увеличится на указанное количество дней
$BackupFolderPath = "d:\Backup\"
$V82Com = New-Object -COMObject "V82.COMConnector"
# Подключение к агенту сервера
$ServerAgent = $V82Com.ConnectAgent($SrvAddr)
$ClusterFound = $FALSE
$InfoBaseFound = $FALSE
# Получим массив кластеров сервера
$Clasters = $ServerAgent.GetClusters()
foreach ($Claster in $Clasters)
{
if ($Claster.MainPort -eq $MainPort)
{
$ClusterFound = $TRUE
break
}
}
if (!($ClusterFound))
{
break
}
# Выполнение архивации базы InfoBase и удаление старых архивов
PerformBackup "localhost\" "InfoBase" "Администратор" "" $BackupFolderPath;
DeleteOldArchives $BackupFolderPath $StorageDays
$V82Com = "";