Backup listázás PowerShellben
Az SQL 2008 R2 előadásomon a Lurdy Házban mutattam egy PS scriptet, ami a következő igényt elégíti ki: egy fájlrendszeren lakó könyvtárban lévő backup fájlokból kinyalja a backup információkat. Íme a script:
function List-Backups(
[string] $filename, ##fájl vagy könyvtárnév, dir parancs számára emészthető input kell
$Html, ## HTML fájl output neve, .\ prefix kell neki lokális esetén
$servername = '.' ## az SQL Server, aki lefuttatja a restore headeronly parancsot
) {
## a tulajdonságok, amik kellenek - teljes lista a BOL-ban
$proplist = ('Position', 'DatabaseName','ServerName','BackupFinishDate','DatabaseVersion')
## mint fent, csak a filename mezővel prefixeltem. igénytelen, de gyors megoldás,
$proplist2 = ('FileName', 'Position', 'DatabaseName','ServerName','BackupFinishDate','DatabaseVersion')
## ez a tömb tárolja a teljes listát
$allbck = @()
foreach ($file in (dir $filename)) ## ezért kellett dir kompatibilis input
{
## lefut a restore headeronly...
$backups = invoke-sqlcmd -ServerInstance ".\mysql" -Query "restore headeronly from disk = '$($file.FullName)'"
$bck = @()
## a kiválasztott mezoket eltesszük a $bck változóba.
## Igazából perzisztált scriptben nem illik olyan shortcutokat használni, mint % (foreach) meg ? (where)
$backups|select $proplist|%{$bck += $_}
## hozzáadjuk a fájlnevet is...
$bck |add-member noteproperty filename $file.FullName
## ... és a kibövitett listát eltesszük az összegzett listába
$allbck += $bck|select $proplist2
} #foreach $file
## kiírjuk az összegzett listát a standard outputra - ez a függvény kimenete
$allbck
## ha meg lett adva HTML fájlnév, akkor abba is kitoljuk a táblázatot, és meg is nyitjuk. Itt lehetne kezelni a .\ hiányát, de nem tettem, lustaságból
if ($Html)
{
$allbck|ConvertTo-Html|Out-file $Html
## itt nyitjuk meg, az alkalmazás a default app a megadott kiterjesztéshez, tehát a böngészőnk htm(l)-nél
invoke-expression $Html
} #if $html
} #function List-Backups
## És nézzünk néhány példát is:
## nézzük meg a D:\SQLData\Backups könyvtár tartalmát, HTML-ben is
List-Backups D:\SQLData\Backups .\lista.html
## nézzünk meg egyetlen fájlt a konzolon
List-Backups D:\SQLData\Backups\Full.BAK
##keressük meg a Billing adatbázis legfrissebb full backupját tartalmazó fájlt és a backup pozícióját a megadott könyvtárban
List-Backups D:\SQLData\Backups | ?{$_.DatabaseName -eq 'Billing' -and $_.BackupTypeDescription -eq 'DATABASE'} | `
Sort -prop BackupFinishDate -desc| select Filename, Position -first 1
Az utolsó parancsba beletoltam több mindent is. A ? (where) a szűrést hivatott bemutatni, a -eq és az -and a vicces operátorokat, amit el is rontottam a demóban, a backtick a többsoros parancs sorvégét jelzi, a többi meg magától értetődő, de azért jó látni, hogy a lehetőségek szinte korlátlanok.

ToolT:
Szia Erik!
Az R2-es előadáson mutattál egy olyan scriptet ami (ha jól emlékszem) megmondta, hogy X felhasználó milyen csoporton keresztül ér el egy adott adatbázist. Fel tudnád tenni azt is?
Köszi!
27 April 2010, 2:29 pmTT
Erik:
Szia!
Persze, majd azt is, ha megtalálom… :)
Erik
27 April 2010, 4:39 pm