Here is a script that I use to gather some size data and spit out a spreadsheet listing name and VMDK size.
{% highlight powershell %}
PowerCLI Script to gather VM Information (Name, VMDK Size)#
Scripted by James Bowling jbowling@vsential.com#
#
#Global Functions function Get-VmSize($vm) { #Initialize variables $VmDirs =@() $VmSize = 0
$searchSpec = New-Object VMware.Vim.HostDatastoreBrowserSearchSpec $searchSpec.details = New-Object VMware.Vim.FileQueryFlags $searchSpec.details.fileSize = $TRUE
Get-View -VIObject $vm | % { #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) $taskMoRef = $dsb.SearchDatastoreSubFolders_Task($dir,$searchSpec) $task = Get-View $taskMoRef
while($task.Info.State -eq “running” -or $task.Info.State -eq “queued”){$task = Get-View $taskMoRef } foreach ($result in $task.Info.Result){ foreach ($file in $result.File){ $VmSize += $file.FileSize } } } }
return $VmSize }
Variables#
$VIServer = “VISERVER” $username = “changeme” $password = “supersecure” $Folder = “C:”
Connect to VIServer#
Connect-VIServer $VIServer -user $username -Password $password
#Initialise Array $Report = @()
Gather VM Information#
$AllVMs = Get-View -ViewType VirtualMachine | Where {-not $.Config.Template} $SortedVMs = $AllVMs | Select *, @{N=“NumDisks”;E={@($.Guest.Disk.Length)}} | Sort-Object -Descending NumDisks ForEach ($VM in $SortedVMs){ $Details = New-object PSObject $Details | Add-Member -Name Name -Value $VM.name -Membertype NoteProperty $DiskNum = 0 Foreach ($disk in $VM.Guest.Disk){ $Details | Add-Member -Name “Disk$($DiskNum)Capacity(GB)” -MemberType NoteProperty -Value ([math]::Round($disk.Capacity/ 1024MB)) $DiskNum++ } $Report += $Details }
$Report | Export-Csv “C:VMDiskSize.csv”
Disconnect from VIServer#
Disconnect-VIServer $VIServer -Confirm:$False {% endhighlight %}