Category Archives: Programming

Automated Shadow Copies in Windows 8.1

For some ridiculous reason, Microsoft decided to not include the Volume Shadow Copy GUI features in Windows 8.1. I wrote the powershell module below to use in a scheduled task. It creates a shadow copy on the specified volume, and optionally deletes any old shadow copies on that volume. You can actually still access the “Previous Versions” property tab for network volumes to retrieve files. To access the shadow copy files on the local machine, just use the admin UNC path (\\host\c$ or similar). To install the module, just save it as a .psm1 in a same-named subdirectory of your PSModulePath (such as c:\Program Files\WindowsPowerShell\Modules\ShadowCopy\ShadowCopy.psm1). You can then just use the Invoke-ShadowCopy command to run it.

function Invoke-ShadowCopy()
    Create shadow copies for a volume and optionally delete old shadow copies
	Designed to be used as a scheduled task for newer versions of
	Windows that don't have built-in support for automated shadow copies
    The drive letter or ID of the volume
	If a number of days is specified, shadow copies older than this will be deleted
    Author: Darrell Enns
    Date:   January 16, 2014    
	$ErrorActionPreference = "Stop"
	$vol=Get-WmiObject -class win32_volume | Where { $_.DriveLetter -eq $volume -or $_.DeviceID -eq $volume }
	write-host "Creating shadow copy on" $vol.DriveLetter
		write-host "Deleting shadow copies older than $PurgeDays days"
function CreateShadowCopy($vol)
	$result=$sc.create($vol.DeviceID, "ClientAccessible")
function DeleteOldShadowCopies($vol)
	Get-WmiObject -class win32_shadowcopy | Where { $_.VolumeName -eq $vol.DeviceID } | Foreach-Object `
		if(($age.TotalDays) -gt $PurgeDays) {
			write-host Deleting old shadow copy from $shadow_date
Export-ModuleMember Invoke-ShadowCopy

Here’s another approach – creating a wrapper to get the full functionality from “vssadmin”. It’s definitely a bit of a hack, but a pretty elegant one and a good read.