David Folksman
David Folksman

Reputation: 235

Consolidate VMWare snapshots older then 30 days in powershell

Im trying to accomplish the above with the script below:

Connect-VIServer -Server ServerName01

$VMName = Get-VM | Get-Snapshot | 
    Where {$_.Created -lt (Get-Date).AddDays(-30)} | select VM |
        ForEach-Object {
            $VMName.ExtensionData.ConsolidateVMDisks()
        }

Im quite new to PowerCLI and this is the best ive come up with so far.

I dont want to run this comand until I can see the contents of the variable $VMName so I ran the following command.

Get-VM | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-30)} | select VM

Which does return a list of VMNames that meet the above criteria (manual check confirms)

The initial code does not work, it doesnt pass anything at all in the $VMName variable to ExtensionData.ConsolidateVMDisks()

Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)} | Remove-Snapshot

works but i would like to see the name of the VM and the Snapshot in the confirmation window.

Thanks.

Upvotes: 1

Views: 800

Answers (1)

AdminOfThings
AdminOfThings

Reputation: 25001

The following will allow you to execute the ConsolidateVMDisks() method for each VM.

$VMName = Get-VM | Get-Snapshot | 
    Where {$_.Created -lt (Get-Date).AddDays(-30)} | select VM

$VMName | Foreach-Object {
    $_.VM.Name
    $_.VM.ExtensionData.ConsolidateVMDisks()
}

The following will meet your requirements using the Remove-Snapshot command:

$Snapshots = Get-VM | Get-Snapshot | Where-Object {$_.Created -lt (Get-Date).AddDays(-30)}
$Snapshots | Foreach-Object {
    "VM Name: {0}" -f $_.VM.Name
    "Snapshot Name: {0}" -f $_.Name
    $_ | Remove-Snapshot
}

In your initial attempt, $VMName contains an array of VM objects. When you pipe an array into a Foreach-Object script block, the current object becomes $_ or $PSItem. That current object is where you must access the property and corresponding methods. I added the $_.Name code to display the current VM name to the console before the consolidate happens. Feel free to remove it if the method already provides the output you need.

Upvotes: 3

Related Questions