############################## # Script created by Hugo Peeters # # http://www.peetersonline.nl # ############################## # Variables $VCServerName = "MYVCSERVER" $CustomFieldName = "Snapshot Size (MB)" $ManagedObjectType = "VirtualMachine" # Script $VC = Connect-VIServer $VCServerName $SI = Get-View ServiceInstance $CFM = Get-View $SI.Content.CustomFieldsManager $myCustomField = $CFM.Field | Where {$_.Name -eq $CustomFieldName} If (!$myCustomField) { # Create Custom Field $FieldCopy = $CFM.Field[0] $CFM.AddCustomFieldDef($CustomFieldName,$ManagedObjectType,$FieldCopy.FieldDefPrivileges,$FieldCopy.FieldInstancePrivileges) } # Fill Custom Fields $VMs = Get-VM $VMViews = $VMs | Get-View ForEach ($VMView in $VMViews) { $SnapshotCount = ($VMView.Snapshot.RootSnapshotList | Measure-Object).Count # Measure Disk Usage of Snapshot $SnapshotDirectory = $VMView.Config.Files.SnapshotDirectory $DatastoreName = $SnapshotDirectory.Split("[] ")[1] $ds = Get-Datastore -Name $DatastoreName | Get-View $fileQueryFlags = New-Object VMware.Vim.FileQueryFlags $fileQueryFlags.FileSize = $true $searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $searchSpec.details = $fileQueryFlags $dsBrowser = Get-View $ds.browser $searchResult = $dsBrowser.SearchDatastoreSubFolders($SnapshotDirectory, $searchSpec) $totalSize = [Math]::Round(($searchResult[0].File | Where {$_.Path -match "delta" -or $_.Path -match "snapshot"} | Measure-Object FileSize -Sum).Sum/1MB,0) # Compare value to current value If ($totalSize -ne ($VMView.CustomValue | ?{$_.Key -eq $myCustomField.Key}).Value) { # Set Custom Value $VMView.setCustomValue($CustomFieldName,$totalSize) } } Disconnect-VIServer -Confirm:$False