Checkpoint-ing Hyper-V with PowerShell
As I just needed it for my own personal test lab. Here is some Powershell to manipulate checkpoints of multiple VMs at a time.
Warning: Use at you own risk and not in production!
<# Removes specific checkpoints for specific virtual machines
replace the "FAB*" for your VM Name filter
replace the "*2015*" for your Snapshot name filter
remove -WhatIf to "make it so"
#>
Get-VM | Where-Object VMName -Like "Fab*" | Get-VMSnapshot | Where-Object Name -like "*2015*" | Remove-VMSnapshot -WhatIf
Output:
What if: Remove-VMSnapshot will remove snapshot "State 0 [04/09/2015 16:17:04]".
What if: Remove-VMSnapshot will remove snapshot "State 1 [04/09/2015 16:17:28]".
What if: Remove-VMSnapshot will remove snapshot "State 2 [04/09/2015 16:17:39]".
What if: Remove-VMSnapshot will remove snapshot "State 0 [04/09/2015 16:17:03]".
What if: Remove-VMSnapshot will remove snapshot "State 1 [04/09/2015 16:17:27]".
...
<# Creates Checkpoints (aka snapshots) for specific virtual machines with your name
replace the "FAB*" for your VM Name filter
#>
Checkpoint-VM -Name "FAB*" -SnapshotName "BeforeInstallingUpdates"
<# Renames specific Checkpoints and attaches date to name
replace the "FAB*" for your VM Name filter
remove -WhatIf to "make it so"
#>
Get-VM -Name "FAB*" | Rename-VMSnapshot -Name "Before*" -NewName "Toller CP $(Get-date)" -WhatIf
<# Creates Checkpoints for specific virtual machines with a fancy name (counts up and adds date)
replace the "FAB*" for your VM Name filter
replace the "State" for your Checkpoint Prefix
#>
Get-VM -Name "FAB*" | ForEach-Object {Checkpoint-VM -Name $_.Name -SnapshotName "State $((Get-VMSnapshot -VM $_).count) [$(Get-date)]"}
we can run this line multiple times…
First run, Second run, Third run of above script.
<# Reapplies a specific Checkpoint (filtered and sorted by Name ) to specific VMs
replace the "FAB*" for your VM Name filter
replace the "State*" for your Checkpoint Name filter
remove -WhatIf to "make it so"
#>
Get-VM -Name "FAB*" | ForEach-Object {$_ | Get-VMSnapshot | Where-Object Name -like "State*"| Sort Name | Select -First 1 | Restore-VMSnapshot -Confirm:$false -WhatIf}