Shadow copies are a brilliant time-saver… I can recover a deleted/overwritten/corruped file in a matter of seconds – or better still, the end user can do it! We currently have a schedule that takes a snapshot of our main fileserver at 7am and noon. While this is quite good, it quickly eats up diskspace, then all the snapshots get ditched and we have to start collecting them again. I wished there was some more complex scheduling and management for the shadows – I would find it far more useful to have more of the recent snapshots, and less of the older ones. Unfortunatly there’s no inbuilt functionality to do this, so I thought it was time to write a script…
I put together the following, it looks through all the snapshots on the system, and will delete those that match the following criteria:
– Older than 3 days and created after 7am
– Older than 7 days and not created on a Monday
– Older than 31 days
Scheduled to run daily, it should work a treat. The amount of snapshots should also stay constant, as once they are older then 31 days they will be removed.
option explicit Dim objWMI, snapshots, snapshot, sDate, vDate, deleteSnapshot Set objWMI = GetObject("winmgmts://localhost/root/cimv2") Set snapshots = objWMI.ExecQuery("select * from Win32_ShadowCopy") set sDate = CreateObject("WbemScripting.SWbemDateTime") WScript.echo "Searching for all snapshots..." for each snapshot in snapshots sDate.Value = snapshot.InstallDate vDate = sDate.GetVarDate(True) WScript.echo vbCrLf & "Found snapshot... Created " & vDate 'WScript.echo snapshot.VolumeName if (DateDiff("d", vDate, Date) > 7) then if (DatePart("w", vDate) <> 2) then WScript.echo "Older than 7 days & Not created on a Monday" deleteSnapshot = true end if end if if (DateDiff("d", vDate, Date) > 3) then if (hour(vDate) > 7) then WScript.Echo "Older than 3 days & Created after 7AM" deleteSnapshot = true end if end if if (DateDiff("d", vDate, Date) > 31) then WScript.Echo "Older than 31 days" deleteSnapshot = true end if if (deleteSnapshot) then WScript.echo "*** Deleting snapshot ***" snapshot.Delete_() deleteSnapshot = false else WScript.echo "*** Keeping snapshot ***" end if next