Powershell script for SnapRaid to create ShadowCopies before syncing and using shadow copies for sync.
$path = "C:\SnapRaid\" | |
$exepath = $path + "snapraid.exe" | |
$config = $path +"snapraid.conf" | |
$config_shadow = $path + "snapraid_shadow2.conf" | |
$data = Get-Content $config | |
$file = New-Object System.IO.StreamWriter $config_shadow | |
$now = Get-Date | |
$logfile = $path + "SnapRAID-$(get-date -format yyMMdd-HHmmss).log" | |
$log = New-Object System.IO.StreamWriter $logfile | |
function writeLog($txt) | |
{ | |
$log.WriteLine($txt) | |
} | |
writeLog("Start") | |
Set-Location $path | |
function GetShadowCopy($Ltr) | |
{ | |
$Ltr = $Ltr.Trim("\\") | |
$Disk = Get-WmiObject -Class Win32_Volume | Where { $_.DriveLetter -eq $Ltr } | |
$LastSnap = (Get-WMIObject win32_shadowcopy) | Where { $_.VolumeName -eq $Disk.DeviceId -and $_.ClientAccessible -eq $true } | Sort InstallDate | Select-Object -Last 1 | |
return $LastSnap | |
} | |
function CreateShadowCopy($Ltr) | |
{ | |
if ((Get-WmiObject Win32_ShadowCopy -List).Create($Ltr,"ClientAccessible")) | |
{ | |
return GetShadowCopy($Ltr) | |
} | |
throw "ShadowCopy Failed" | |
} | |
# Search Disks in config file | |
foreach ( $l in $data ) | |
{ | |
if ( $l.StartsWith("disk") ) | |
{ | |
$tmp = $l.Split(" ") | |
writeLog("Cheking shadow copy for: "+$tmp[2]) | |
$sc = GetShadowCopy($tmp[2]) | |
if ($sc) | |
{ | |
$Dt = [system.management.managementdatetimeconverter]::todatetime(($sc).InstallDate) | |
if ($now.Subtract($Dt).TotalHours -gt 12) | |
{ | |
writeLog("Updating shadow copy for: " + $tmp[2]) | |
$sc = CreateShadowCopy($tmp[2]) | |
} | |
else | |
{ | |
writeLog("Skipping, less than 12 hours old") | |
} | |
} | |
else | |
{ | |
writeLog("Creating shadow copy for: " + $tmp[2]) | |
$sc = CreateShadowCopy($tmp[2]) | |
} | |
$file.WriteLine("disk "+ $tmp[1] + " " + $sc.DeviceObject + "\") | |
} | |
else | |
{ | |
$file.WriteLine($l) | |
} | |
} | |
writeLog("Launching snapraid...") | |
$file.Close() | |
$log.Close() | |
& $exepath sync -c "$config_shadow" | out-file $logfile | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment