четверг, 10 ноября 2011 г.

Backup и PowerShell

Сегодня столкнулся с такой задачей, по созданию скрипта который будет выполнять следующие функции:

  • Выполнить копирование определенной коллекции сайтов
  • Подставлять в название дату и рендерить само название
  • Отправлять почту по завершению копирования
И после долгих экспириментов и серфинга.
Получилось что-то вот такое:




Рабочий пример:

cls
if((Get-PSSnapin | Where {$_.Name -eq "Microsoft.SharePoint.PowerShell"}) -eq $null) { 
Add-PSSnapin Microsoft.SharePoint.PowerShell; 

# Определение функции Backup-SPSiteCollections
Function Backup-SPSiteCollections () 
{
 param(
         [Parameter( 
             Position=0, 
             Mandatory=$true
         )] 
         [Guid]$SPSiteID,
  
         [Parameter( 
             Position=0,
             Mandatory=$true
         )] 
         [string]$BackupFolder, 



         [Parameter(
             Position=0, 
             Mandatory=$true
         )] 
         [string]$SiteName, 

         [Parameter( 
             Position=0, 
             Mandatory=$true
         )] 
         [int]$BackupFilesLimit, 

         [Parameter( 
             Position=0, 
             Mandatory=$false
         )] 
         [string]$Email = "", 

         [Parameter(
             Position=0, 
             Mandatory=$false
         )] 
         [string]$SmtpServer = ""
     ) 

     $siteNameSlug = $SiteName -replace "https://", ""
     $siteNameSlug = $siteNameSlug -replace "http://", ""
     $siteNameSlug = $siteNameSlug -replace ":", "-"
     $siteNameSlug = $siteNameSlug -replace " ", "-"
     $siteNameSlug = $siteNameSlug -replace "/", "-"
     $siteNameSlug = $siteNameSlug -replace "\.", "-"

     # Проверка существует ли папка для резервного копирования
     if (Test-Path $BackupFolder) 
     { 
         # Получаем предыдущие копии, сортируем по времени
         $files = Get-Childitem $BackupFolder | where {$_.Name -like ("*" + $siteNameSlug + "*.bak")} | Sort $_.LastWriteTime 
         $filesCount = @($files).Count 
         # Если лимит превышен
         if($filesCount -ge $BackupFilesLimit) 
         { 
             # Удаляет старые копии
             for ( $i=0; $i -lt $filesCount-$BackupFilesLimit+1; $i++) 
             { 
                 Remove-Item ($BackupFolder + $files[$i].Name) 
             } 
         } 
     } 
     # Если папки нет то создаем
     else 
     { 
         New-Item $BackupFolder -type directory 
     } 
     $backupFileName = ("" + $siteNameSlug + "_" + (Get-Date -Format yyyy_MM-dd_hh-mm) + ".bak") 
     $backupFilePath = $BackupFolder + $backupFileName
     $startTime = Get-Date
     Backup-SPSite -identity $_.ID -path ($backupFilePath) -force
     $endTime = Get-Date
     # Проверка аттрибутов для отправки сообщения
     if($Email -ne "" -and $SmtpServer -ne "") 
     { 
         $subject = "SharePoint: Резервное копирование успешно завершено!"
         $body = "В резервном хранилище находится следующая коллекция сайта: " + $SiteName + "`n"
         $body += "Коллекция сайтов в резервном хранилище: " + $backupFileName + "`n"
         $body += "Резервное копирование началось: " + $startTime + ", и была завершена: " + $endTime + "`n`n"
         # Получение размеров коллеекции сайта
         $SiteCollectionSize = Get-SPSite "<URL Web Application>
" | Select @{Label="Size"; Expression={$_.Usage.Storage/1MB}} | Select Size 
         # Получение размеров резервной копии
         $backupFileSize = Get-ChildItem $backupFilePath
         $backupFileSize = [Math]::Round($backupFileSize.length/1MB, 2) 
         $body += "Site collection size on SharePoint system is: " + [Math]::Round($SiteCollectionSize.Size, 2) + " MB`n"
         $body += "Backup file size: " + $backupFileSize + " MB"
         $smtp = new-object Net.Mail.SmtpClient($SmtpServer) 
         # Отправка почты 
         $smtp.Send($Email, $Email, $subject, $body) 
     } 
 } 
 # Резервное копирование определенных коллекций сайта
  Get-SPSite <URL Site Collection>
| ForEach-Object {Backup-SPSiteCollections -SPSiteID $_.ID -BackupFolder "d:\Backups\" -SiteName $_.Url -BackupFilesLimit 10 -Email "Ваш ящик" -SmtpServer "<Ваш SMTP Server>"}



Links: http://www.spdockit.com/
          http://technet.microsoft.com/en-us/library/ee428315.aspx

Комментариев нет:

Отправить комментарий