I’ve created another way to gather and display VMware Virtual Disk information with the Powershell VI Toolkit.
The attached script generates a csv-file with all Virtual Machines’ Disks, in which Datastore they are stored, the LUN IDs of the extents that make up this Datastore (in HEX) and the Vendor of the SAN those LUNs are on (just in case you have multiple). Simpy a great way to determine which LUNs are used by which virtual server(s) in a complex environment.
By the way: the script is filled with comments to allow you to learn how it works.
create-vmdiskoverview (Rename to .ps1)
Enjoy!
Hugo
No related posts.


NiTRo
January 8th, 2009
Hi Hugo,
I’d like to a row for hostname but i’m not very smart in powershell, may you help me ?
Anyway, your script is very cool :)
Thx
admin
January 8th, 2009
@NiTRo
NiTRo,
Adjust the following line:
Select VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
Replace it with this:
Select VMHost, VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
And add the following line below it:
$myObj.VMHost = $VMHost.Name # ESX Server Name
Thanks,
Hugo
NiTRo
January 9th, 2009
Thanks Hugo, it works like a charm !
NiTRo
January 9th, 2009
I also wish i can get a field value from the VC, do you know if it is possible ?
Thanks
eric
January 13th, 2009
great information! thanks!
http://www.vmwarescripting.com/
David
January 26th, 2009
Is there a way to modify this so that it would pull back sizes of the disks as well?
Hugo
January 27th, 2009
@David
@David
Easy! Just modify this line:
Select VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
Change it into this:
Select VM, Description, Disk, DiskSizeGB, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
And add this line below it:
$myObj.DiskSizeGB = [math]::Round(($DISK.CapacityKB * 1KB / 1GB),0) #Disk Size
Hugo
David
February 3rd, 2009
@Hugo
Thank you Hugo. This was a big help.
David
February 9th, 2009
Is there any way for RDMs to show up as RDMs? I noticed they show up as virtual disks on the datastore in which the mapping file exists. Wondering if there’s a way to dive deeper, and identify these as RDMs and indicate LUN ID. Also, any good resources for VI-Toolkit education? Been googling, but resources are limited. Thanks.
Eric
March 25th, 2009
Hugo,
This script is great. It gives me almost everything I need… there is one thing I would like. I would like to add a column for the name of the VMDK as well. Being a newbie at scripting… is that possible?
admin
March 26th, 2009
@Eric
Modify this line:
Select VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
into:
Select VM, Description, Disk, Datastore, VMDK, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
Add the following line below that line:
$myObj.VMDK = $DISK.Filename.Split(“/”)[1]
invisible
June 4th, 2009
Hugo,
Great script, thank you. But when I run it scripts runs for number of minutes and than I got
————————–
You cannot call a method on a null-valued expression.
At :line:29 char:41
+ $myObj.Datastore = $DISK.Filename.Split <<<< (“[]“)[1] # Datastore Name
————————–
and no csv file is created.
admin
June 4th, 2009
@invisible I’m guessing you have $ErrorActionPreference set to “Stop”. Try setting: $ErrorActionPreference = “Continue”. You will still see a lot of errors, but the script will finish.
The reason for this script to generate errors, is that is assumes three disks are present in each and eveny vm. I had to pick a number and keep it the same for all the vm’s, because of difficulties displaying irregular information. Anyway, let me know if this helps.
Hugo
Harm
June 15th, 2009
This script is very useful. I how do you change the number of present disks that the script scans for from 3 to 4? We have various VMs with more than 3 virtual disks. Thanks!
admin
June 16th, 2009
@Harm
The script does loop through ALL your disks. Only problem if you have more than 4 extents in a datastore. Then you should add hexLUN… to the following line:
Modify line:
Select VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, SAN # Create output object
Into: Select VM, Description, Disk, Datastore, hexLUN0, hexLUN1, hexLUN2, hexLUN3, hexLUN4, SAN # Create output object
Etc.
Hugo
Michael
June 22nd, 2009
Hi Hugo,
firstly, a great script! Can I also add a column for the datacenter? I am also new with powershell and scripting in general and I didn’t find anything about $myObj.* and the “Select” part in your script.
Thanks.
admin
June 22nd, 2009
@Michael
I use “$myObj = “” | Select Name, Etc” to create custom objects to hold the output of my scripts. Read more here: http://www.peetersonline.nl/?s=advice
You could add an outer loop doing ForEach ($Datacenter in Get-datacenter){…} and add a property named $myObj.Datacenter with the value $Datacenter.Name.
Read some of the scripts on my site to get some feeling on how this works.
Hugo
Ejire
July 14th, 2009
Hi Hugo,
I also wish I can get a field value from the Disk path or disk drive letter, do you know if it is possible ?
Thanks
admin
July 14th, 2009
@Ejire
Try this script:
http://www.peetersonline.nl/index.php/vmware/get-vmware-disk-usage-with-powershell/
Mike
August 10th, 2009
Going off of the Question from Hugo on 1/27, is there a way to give the “used” space of the guest’s VMDK? I’m trying to monitor the growth on a differential disk of link-cloned VDI guests.
Lars
January 26th, 2010
Hi Hugo,
Your script helped me a lot.
Thanks for sharing.
admin
January 26th, 2010
That’s great, thanks for commenting!
Hugo
Frank
August 25th, 2010
Hi Hugo,
Could you give me an example of an outer loop to get the cluster that each VM is connected to. For some reason my loop doesn’t end.
Thanks!