This script generates an email report of virtual machines that have snapshots running.
$OutputFile = "VM-Snapshot.csv"
function Log ($text) {
[int]$duration = (New-TimeSpan $start (Get-Date)).TotalSeconds
Write-Host "$duration secs | $text"
}
function Log-NoNewLine ($text) {
[int]$duration = (New-TimeSpan $start (Get-Date)).TotalSeconds
Write-Host "$duration secs | $text" -nonewline
}
$start = Get-Date
$table = New-Object system.Data.DataTable "Results"
$table.columns.add((New-Object system.Data.DataColumn Name,([string])))
$table.columns.add((New-Object system.Data.DataColumn Folder,([string])))
$table.columns.add((New-Object system.Data.DataColumn Snap,([string])))
$table.columns.add((New-Object system.Data.DataColumn Created,([datetime])))
$table.columns.add((New-Object system.Data.DataColumn Size_MB,([single])))
$table.columns.add((New-Object system.Data.DataColumn PowerState,([string])))
Log("Getting list of VMs to check...")
$VMs = Get-VM | Where {$_.PowerState -eq "PoweredOn"} | Sort -Property Name
Log ("Got list of " + ($VMs.Count) + " VMs to check")
$VMno = 0
$VMtot = $VMs.Count
foreach ($vm in $VMs) {
$VMno = $VMno + 1
Log-NoNewLine "[$VMno/$VMtot] $vm - "
$Snaps = Get-Snapshot -VM $vm
if ($Snaps) {
foreach ($snap in $snaps) {
$row = $table.NewRow()
$row.Name = $vm.Name
$row.Folder = Get-Folder -Id $vm.FolderId
$row.Snap = $snap.Name
$row.Created = $snap.Created
$row.Size_MB = $snap.SizeMB
$row.PowerState = $snap.PowerState
Write-Host $row.Snap "| Created" $row.Created "| Size" $row.Size_MB "MB | " $row.PowerState
}
} else {
Write-Host "No snapshot"
}
}
if ($table.rows.Count) {
Log "Completed, writing out table..."
$table | Format-Table
$table | Export-Csv -path $OutputFile
#Send via email
$smtp = New-Object Net.Mail.SmtpClient -arg "smtpserver"
$msg = New-Object Net.Mail.MailMessage
$attach = New-Object Net.Mail.Attachment($OutputFile)
$msg.From = "from"
$msg.To.Add = "to"
$msg.Subject = "Snapshots found running!!"
$msg.Body = "$table.rows.Count snapshots found to be running, see attachment for further info"
$smtp.Send($msg)
$attach.Dispose()
}
Log "Completed!"
save above and run as below
.\getsnapshotsize.ps1