0

PowerShell script dosyaları veya PowerShell kod’u powershell.exe ile çalıştırılabilmektedir. Eğer kod’umuzu bir batch file içerisinde execute etmek istersek kullanım şeklini değiştirmemiz gerekmektedir. Bu makalede batch file içerisinde SQL Server 2012 instance’ımız üzerindeki database’leri PowerShell yardımıyla batch file içerisinden nasıl yedekleyeceğimizi inceleyeceğiz.

 

Database’lerin PowerShell ile yedeklenmesi

Öncelikle daha önceki makalelerde değindiğimiz gibi ilk olarak SQLPS modül’ünü import etmemiz gerekmektedir.

Import-Module SQLPS -DisableNameChecking

 

Sonrasında MS-DOS içerisinde istediğimiz klasör lokasyonuna gider gibi Database’lerin tutulduğu konum’a geçiyoruz.

cd .\SQL\WIN-FR9KD1KUOBD\DEFAULT\Databases

 

Bundan sonra ForEach kullanarak bütün database’lerimiz için dönen bir döngü oluşturuyoruz. Backup-SqlDatabase komutu ile de Database’lerimizin backup’ını aldırıyoruz. Tasarlamış olduğumuz script’i aşağıya ekliyorum. Ben Database’lerimizin yedeğini compress ederek almak için Backup-SqlDatabase komutu içerisindeki CompressionOption özelliğinide kullandım.

Import-Module SQLPS -DisableNameChecking
cd .\SQL\WIN-FR9KD1KUOBD\DEFAULT\Databases
foreach($DB in (Get-ChildItem))
 { 
   $DateTime = Get-Date -Format _dd.MM.yyyy_HH.mm
   $DatabaseName = $DB.Name
   $BackupPath = "C:\Backup\"
   $BackupFile = $BackupPath + $DatabaseName + $DateTime + ".bak"
   Backup-SqlDatabase -CompressionOption 1 -Database $DatabaseName -BackupFile $BackupFile -Initialize
 }

Oluşturmuş olduğumuz PowerShell script’imizi Backup.ps1 olarak kaydedip execute ediyoruz.

 

 

 

 

 

 

 

 

 

PowerShell script’inin Batch File içerisinde Kullanımı

Eğer PowerShell kod’unuz bir script file’ı içerisindeyse bunu rahatlıkla Batch File içerisinden okuyabilirsiniz. Ama file olarak değil de kod olarak execute etmek istersek durum biraz farklılaşıyor. Bu yüzden bizde senaryomuzu biraz daha farklılaştıralım. Database’lerimizi yedeklemek için yukarıda oluşturduğumuz script’imizi script file’ı olarak oluşturmayıp, Batch File içerisine aktarıp Sistem Yöneticisine schedule task olarak tanımlaması için verelim. Fakat Batch file içerisindeki PowerShell kod’umuzu da görmesini istemiyoruz. Burada dikkat edilmesi gereken iki nokta var. Birincisi, bazı PowerShell syntax’leri Batch File içerisinde okunamaz ve çoklu satır kod’umuzu da asla execute etmeye izin vermez. Bunun üzerine PowerShell üzerinde bulunan -EncodedCommand parametresi senaryomuza çözüm olacaktır. -EncodedCommand parametresi ile PowerShell kod’umuzu Base-64 olarak encode edip ve bunu rahatlıkla Batch File içerisinde execute ettirebiliriz.

-EncodedCommand parametresini kullanmadan ilk olarak aşağıdaki gibi PowerShell kod’umuzu Base-64 olarak set edelim. Bunun için oluşturmuş olduğumuz Backup script’imizi $Kod olan bir değişkene atıyoruz ve  [convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($Kod)) diyerek output olarak kod’umuzun Base-64 halini alıyoruz.

Base-64 olarak çevireceğimiz kod’umuzu aşağıdaki gibi oluşturup *.ps1 olarak kaydedip execute ediyoruz.

$Kod = {
Import-Module SQLPS -DisableNameChecking
cd .\SQL\WIN-FR9KD1KUOBD\DEFAULT\Databases
foreach($DB in (Get-ChildItem))
 { 
   $DateTime = Get-Date -Format _dd.MM.yyyy_HH.mm
   $DatabaseName = $DB.Name
   $BackupPath = "C:\Backup\"
   $BackupFile = $BackupPath + $DatabaseName + $DateTime + ".bak"
   Backup-SqlDatabase -CompressionOption 1 -Database $DatabaseName -BackupFile $BackupFile -Initialize
 }

}

[convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($Kod))

 

Execute ettiğimizde aşağıdaki gibi Encode edilmiş olan kod’umuza ulaşıyoruz.

 

 

 

 

 

 

 

 

 

Artık encode edilen script’imizi aşağıdaki gibi Batch File içerisinde çalıştırmamız mümkün.

 

Leave a Reply