# 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