# This script saves CSV report on ALL VMs and their disk sizes on the specified VMware cluster
# REQUIRED cluster name
$Cluster = "Cluster_NAME"
# REQUIRED report file name
$date = Get-Date -Format "yyyy-MM-dd-HH-mm"
$report_file_name = "\VM_Disk_Report-"+$date+".csv"
$VMs = Get-Cluster $Cluster | Get-VM | sort host,name
# in absence of cluster you can get VMs from datacenter
# $VMs = Get-Datacenter | Get-VM | sort host,name
# Get-Cluster $Cluster | Get-VM | % {get-harddisk -vm $_.Name} | Out-GridView
$path = Split-Path -parent $MyInvocation.MyCommand.Definition
$newpath = $path + $report_file_name
$Data = @()
foreach ($VM in $VMs){
$firstdisk = 1
$VMDKs = $VM | get-HardDisk
foreach ($VMDK in $VMDKs) {
switch ($firstdisk) {
0 { if ($VMDK -ne $null) {
$into = New-Object PSObject
Add-Member -InputObject $into -MemberType NoteProperty -Name "Host" ""
Add-Member -InputObject $into -MemberType NoteProperty -Name "VM Name" ""
Add-Member -InputObject $into -MemberType NoteProperty -Name "vCPU" ""
Add-Member -InputObject $into -MemberType NoteProperty -Name "RAM (GB)" ""
Add-Member -InputObject $into -MemberType NoteProperty -Name "vDisk Count" ""
Add-Member -InputObject $into -MemberType NoteProperty -Name "VMDK File Name" $VMDK.FileName.Split(']')[1].TrimStart('[')
Add-Member -InputObject $into -MemberType NoteProperty -Name "Capacity (GB)" ([int64]$VMDK.CapacityKB/1024/1024)
Add-Member -InputObject $into -MemberType NoteProperty -Name Datastore $VMDK.FileName.Split(']')[0].TrimStart('[')
Add-Member -InputObject $into -MemberType NoteProperty -Name "Disk Type" $VMDK.DiskType
Add-Member -InputObject $into -MemberType NoteProperty -Name Persistence $VMDK.Persistence
$Data += $into } #end if
} # end option 0
1 { if ($VMDK -ne $null) {
$into = New-Object PSObject
Add-Member -InputObject $into -MemberType NoteProperty -Name "Host" $VM.Host
Add-Member -InputObject $into -MemberType NoteProperty -Name "VM Name" $VM.Name
Add-Member -InputObject $into -MemberType NoteProperty -Name "vCPU" $VM.NumCpu
Add-Member -InputObject $into -MemberType NoteProperty -Name "RAM (GB)" ([int]$VM.MemoryMB/1024)
Add-Member -InputObject $into -MemberType NoteProperty -Name "vDisk Count" $VMDKs.Count
Add-Member -InputObject $into -MemberType NoteProperty -Name "VMDK File Name" $VMDK.FileName.Split(']')[1].TrimStart('[')
Add-Member -InputObject $into -MemberType NoteProperty -Name "Capacity (GB)" ([int64]$VMDK.CapacityKB/1024/1024)
Add-Member -InputObject $into -MemberType NoteProperty -Name Datastore $VMDK.FileName.Split(']')[0].TrimStart('[')
Add-Member -InputObject $into -MemberType NoteProperty -Name "Disk Type" $VMDK.DiskType
Add-Member -InputObject $into -MemberType NoteProperty -Name Persistence $VMDK.Persistence
$Data += $into } #end if
} # end option 1
} # end switch
$firstdisk = 0
} # end for each $VMDK
} # end for each $VM
#$Data | Sort-Object Datastore,"VMDK File Name","VM Name" | Export-Csv -Path $newpath -NoTypeInformation
$Data | Export-Csv -Path $newpath -NoTypeInformation