function Get-VmSize($VmViewObj) # modded version from Arnim van Lieshout http://www.van-lieshout.com/2009/07/how-big-is-my-vm/ { #Initialize variables $VmDirs =@() $VmSize = 0 $fileQueryFlags = New-Object VMware.Vim.FileQueryFlags $fileQueryFlags.FileSize = $true #$fileQueryFlags.FileType = $true #$fileQueryFlags.Modification = $true $searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $searchSpec.details = $fileQueryFlags $VmViewObj | % { #Create an array with the vm's directories #$VmDirs += $_.Config.Files.VmPathName.split("/")[0] $VmDirs += $_.Config.Files.SnapshotDirectory.split("/")[0] #$VmDirs += $_.Config.Files.SuspendDirectory.split("/")[0] #$VmDirs += $_.Config.Files.LogDirectory.split("/")[0] #Add directories of the vm's virtual disk files foreach ($disk in $_.Layout.Disk) { foreach ($diskfile in $disk.diskfile){ $VmDirs += $diskfile.split("/")[0] } } #Only take unique array items $VmDirs = $VmDirs | Sort | Get-Unique foreach ($dir in $VmDirs){ $ds = Get-Datastore ($dir.split("[")[1]).split("]")[0] $dsb = Get-View (($ds | get-view).Browser) if (($global:DefaultVIServer).Version -cge "4.1"){$searchSpec = [VMware.Vim.VIConvert]::ToVim41($searchSpec)} elseif (($global:DefaultVIServer).Version -eq "4.0.0"){$searchSpec = [VMware.Vim.VIConvert]::ToVim4($searchSpec)} $searchSpec.details.fileOwnerSpecified = $true if (($global:DefaultVIServer).Version -cge "4.1"){$dsBrowserMoRef = [VMware.Vim.VIConvert]::ToVim41($dsb.MoRef)} elseif (($global:DefaultVIServer).Version -eq "4.0.0"){$dsBrowserMoRef = [VMware.Vim.VIConvert]::ToVim4($dsb.MoRef)} $taskMoRef = $dsb.Client.VimService.SearchDatastoreSubFolders_Task($dsBrowserMoRef, $dir, $searchSpec) $task = [VMware.Vim.VIConvert]::ToVim($dsb.WaitForTask([VMware.Vim.VIConvert]::ToVim($taskMoRef))) foreach ($result in $task){ foreach ($file in $result.File){ $VmSize += $file.FileSize } } } } return $VmSize } function Get-hypersnapshot($VMViews) { $snapp = @() ForEach ($VMView in $VMViews) { if ($VMView.Snapshot) { $vmg = Get-VM -Name $VMView.name $vmname = $VMView.name $hddsize = 0 $snapcount = 0 ForEach ($DISK in $vmg.HardDisks) # Loop through VM's harddisks {$hddsize = $hddsize+[math]::round($DISK.CapacityKB/1048576, 0)} $totalsize = Get-VmSize($vmname) $totalsize = [math]::round($totalsize/1073741824,0) $snappObj = "" | Select vmdkSize,RealSize $snappObj.vmdkSize = $hddsize $snappObj.RealSize = $totalsize $snapp += $snappObj } } return $snapp } $VMViews = Get-View -ViewType VirtualMachine |?{-not $_.Config.Template} $Snapshots = Get-hypersnapshot($VMViews) $totaldifsize = 0 Foreach ($Snapshotinfo in $Snapshots) { $difsize = ($Snapshotinfo.RealSize - $Snapshotinfo.vmdkSize) $totaldifsize += $difsize } write-host "$totaldifsize GB"