VIProperties
The New-VIProperty cmdlet, that was introduced with PowerCLI 4.1, offers endless possibilities to add new properties to any PowerCLI object.
For an overview of what you can do with the New-VIProperty cmdlet have a look at my PowerCLI 4.1 brings the New-VIProperty cmdlet post.
I created this page to collect useful code blocks and extension properties that can be used with the new cmdlet.
Since August 17th 2011 all the New-VIProperty entries from this page are now also available as a module. For the installation instructions see the VIProperties in a Module post.
Feel free to forward me your New-VIProperty statements and I will include them in the list.
- Cluster
- Datastore
- Harddisk
- PhysicalNic
- Portgroup
- ScsiControler
- ScsiLun
- Snapshot
- VirtualMachine
- VMHost
Cluster
NumberOfHosts
New-VIProperty -Name NumberOfHosts -ObjectType Cluster `
-Value {
param($cluster)
@($cluster.Extensiondata.Host).Count
} `
-BasedOnExtensionProperty 'Host' `
-Force
NumberOfVMs
New-VIProperty -Name NumberOfVMs -ObjectType Cluster `
-Value {
param($cluster)
($cluster.Extensiondata.Host | %{Get-View $_} | `
Measure-Object -InputObject {$_.Vm.Count} -Sum).Sum
} `
-BasedONextensionProperty 'Host' `
-Force
NumberVmotions
Credit: Maish Saidel-Keesing
New-VIProperty -Name NumberVmotions -ObjectType Cluster -Value {
param($cluster)
$cluster.ExtensionData.Summary.NumVmotions
} -Force
NumCPU
Credit: Alan Renouf
New-VIProperty -Name NumCPU -ObjectType Cluster `
-Value {
$TotalPCPU = 0
$Args[0] | Get-VMHost | foreach {
$TotalPCPU += $_.NumCPU
}
$TotalPCPU
} -Force
NumPoweredOnvCPUs
Credit: Alan Renouf
New-VIProperty -ObjectType Cluster -name NumPoweredOnvCPUs `
-Value {
$TotalvCPU = 0
$Args[0] | Get-VMHost | foreach {
$TotalvCPU += $_.NumPoweredOnvCPUs
}
$TotalvCPU
} -Force
NumvCPUs
Credit: Alan Renouf
New-VIProperty -Name NumvCPUs -ObjectType Cluster `
-Value {
$TotalvCPU = 0
$Args[0] | Get-VMHost | foreach {
$TotalvCPU += $_.NumvCPUs
}
$TotalvCPU
} -Force
Datastore
CapacityGB
New-VIProperty -Name CapacityGB -ObjectType Datastore `
-Value {
param($ds)
[Math]::Round($ds.CapacityMB/1KB,1)
} `
-Force
FreeGB
New-VIProperty -Name FreeGB -ObjectType Datastore `
-Value {
param($ds)
[Math]::Round($ds.FreeSpaceMb/1KB,1)
} `
-Force
NumberOfVMs
Credit: Robert van den Nieuwendijk
New-VIProperty -Name NumberOfVMs -ObjectType Datastore `
-Value {
param($ds)
$ds.ExtensionData.VM.Length
} `
-Force
PercentFree
Credit: Sean Duffy
New-VIProperty -Name PercentFree -ObjectType Datastore -Value {
param($ds)
"{0:P2}" -f ($ds.FreeSpaceMB/$ds.CapacityMB)
} -Force
ProvisionedGB
New-VIProperty -Name ProvisionedGB -ObjectType Datastore `
-Value {
param($ds)
[Math]::Round(($ds.ExtensionData.Summary.Capacity - $ds.ExtensionData.Summary.FreeSpace + $ds.ExtensionData.Summary.Uncommitted)/1GB,1)
} `
-BasedONextensionProperty 'Summary' `
-Force
Harddisk
Datastore
New-VIProperty -Name Datastore -ObjectType Harddisk -Value {
param($hd)
$hd.Filename.Split(']')[0].TrimStart('[')
} -Force
UnitNumber
New-VIProperty -Name UnitNumber -ObjectType Harddisk ` -ValueFromExtensionProperty 'UnitNumber' -Force
PhysicalNic
LinkState
New-VIProperty -Name LinkState -ObjectType PhysicalNic -Value {
param($nic)
if($nic.Extensiondata.LinkSpeed){"up"}else{"down"}
} -Force
Portgroup
vCenterServer
New-VIProperty -Name vCenterServer `
-ObjectType DistributedPortgroup,VirtualPortgroup `
-Value {
$Args[0].Uid.Split(':')[0].Split('@')[1]
} -Force
ScsiController
Harddisk
New-VIProperty -Name Harddisk -ObjectType ScsiController -Value {
param($sc)
foreach($device in $sc.ExtensionData.Device){
($sc.Parent.ExtensionData.Config.Hardware.Device | `
where {$_.Key -eq $device}).DeviceInfo.Label
}
} -Force
ScsiLun
lunDatastoreName
New-VIProperty -Name lunDatastoreName -ObjectType ScsiLun -Value {
param($lun)
$ds = $lun.VMHost.ExtensionData.Datastore | %{Get-View $_} | `
where {$_.Summary.Type -eq "VMFS" -and
($_.Info.Vmfs.Extent | where {$_.DiskName -eq $lun.CanonicalName})}
if($ds){
$ds.Name
}
} -Force
lunID
New-VIProperty -Name lunID -ObjectType ScsiLun -Value {
param($lun)
[int](Select-String ":L(?\d+)$" `
-InputObject $lun.RuntimeName).Matches[0].Groups['lunID'].Value
} -Force
Snapshot
Datacenter
Credit: Alan Renouf
New-VIProperty -Name "Datacenter" -ObjectType Snapshot `
-Value {
param ($Snapshot)
Get-Datacenter -VM ($Snapshot.VM)
} -Force
DaysOld
Credit: Alan Renouf
New-VIProperty -Name "DaysOld" -ObjectType Snapshot `
-Value {
param ($Snapshot)
((Get-Date) - $Snapshot.Created).Days
} -Force
vCenter
Credit: Alan Renouf
New-VIProperty -Name "vCenter" -ObjectType Snapshot `
-Value {
param ($Snapshot)
([Uri](Get-VM $Snapshot.VM).ExtensionData.Client.ServiceUrl).Host
} -Force
VirtualMachine
BootDelay
New-VIProperty -Name "BootDelay" -ObjectType VirtualMachine `
-Value {
param($vm)
$vm.ExtensionData.Config.BootOptions.BootDelay
} -BasedOnExtensionProperty "Config.BootOptions" `
-Force
BootTime
Credit: Robert van den Nieuwendijk
New-VIProperty -Name BootTime -ObjectType VirtualMachine `
-Value {
param($vm)
$vm.ExtensionData.Summary.Runtime.BootTime.ToLocalTime()
} -Force
CBTEnabled
Credit: Alan Renouf
New-VIProperty -Name CBTEnabled -ObjectType VirtualMachine ` -ValueFromExtensionProperty "Config.ChangeTrackingEnabled" ` -Force
CpuHotAddEnabled
Credit: Hal Rottenberg
New-VIProperty -Name 'CpuHotAddEnabled' `
-BasedOnExtensionProperty 'Config.ExtraConfig' `
-ObjectType VirtualMachine `
-Value {
param($vm)
[bool]( $vm.ExtensionData.Config.ExtraConfig | `
? { $_.key -eq 'vcpu.hotadd' }).Value
} -warningAction 'silentlycontinue' -Force
DNSname
Credit: Jonathan Medd
New-VIProperty -Name DNSName -ObjectType VirtualMachine -Value {
param($vm)
$vm.ExtensionData.Guest.Hostname
} -BasedOnExtensionProperty "Guest.Hostname" -Force
MemoryHotAddEnabled
Credit: Hal Rottenberg
New-VIProperty -Name 'MemoryHotAddEnabled' `
-BasedOnExtensionProperty 'Config.ExtraConfig' `
-ObjectType VirtualMachine `
-Value {
param($vm)
[bool]( $vm.ExtensionData.Config.ExtraConfig | `
? { $_.key -eq 'mem.hotadd' }).Value
} -WarningAction 'silentlycontinue' -Force
MemReservation
Credit: Alan Renouf
New-VIProperty -Name MemReservation -ObjectType VirtualMachine `
-Value {
param($vm)
$vm.ExtensionData.Summary.Config.memoryReservation
} -Force
NumVirtualDisks
Credit: Alan Renouf
New-VIProperty -Name NumVirtualDisks -ObjectType VirtualMachine `
-Value {
param($vm)
$vm.ExtensionData.Summary.Config.numVirtualDisks
} -Force
OSName
Credit: Jonathan Medd
New-VIProperty -Name "OSName" -ObjectType VirtualMachine -Value {
param($vm)
$vm.ExtensionData.Guest.GuestFullName
} -BasedOnExtensionProperty "Guest.GuestFullName" -Force
SnapshotSpaceUsed
Ignore the warning about the ‘$_’ variable
New-VIProperty -Name SnapshotSpaceUsed -ObjectType VirtualMachine -Value {
param($vm)
$fileList = $vm.ExtensionData.LayoutEx.Disk | %{
$_.Chain | Select -Skip 1 | %{
$_.FileKey | %{
$_
}
}
}
$vm.ExtensionData.LayoutEx.File | where{$fileList -contains $_.Key} | %{
$snapSize += $_.Size
}
$snapSize
} -Force -BasedOnExtensionProperty 'LayoutEx'
ToolsVersion
Credit: Carter Shanklin
New-VIProperty -Name ToolsVersion -ObjectType VirtualMachine ` -ValueFromExtensionProperty ‘config.tools.ToolsVersion’ ` -Force
ToolsVersionStatus
Credit: Hal Rottenberg
New-VIProperty -Name ToolsVersionStatus -ObjectType VirtualMachine -Value {
param($vm)
$vm.ExtensionData.Guest.ToolsVersionStatus
} -Force
vCenterServer
Credit: Robert van den Nieuwendijk
New-VIProperty -Name vCenterServer -ObjectType VirtualMachine `
-Value {$Args[0].Uid.Split(“:”)[0].Split(“@”)[1]} -Force
VMIenabled
New-VIProperty -Name VMIenabled -ObjectType VirtualMachine `
-Value {
param($vm)
($vm.Extensiondata.Config.Hardware.Device | where {$_.GetType().Name -eq "VirtualMachineVMIROM"}) -ne $null
} -BasedOnExtensionProperty "Config.Hardware.Device" `
-Force
VmxDatastoreFullPath
Credit: Hal Rottenberg
New-VIProperty -Name VmxDatastoreFullPath ` -ObjectType VirtualMachine ` -ValueFromExtensionProperty Config.Files.VmPathName ` -Force
WebShortcut URL
Credit API 4 part: Robert van den Nieuwendijk
API 5 part: me
New-VIProperty -Name WebShortcut -ObjectType VirtualMachine `
-Value {
param($vm)
$vCenterServer = $vm.Uid.Split(“:”)[0].Split(“@”)[1]
if($vm.ExtensionData.Client.ServiceContent.About.ApiVersion.Split('.')[0] -ge 5){
$Uuid = $vm.ExtensionData.Client.ServiceContent.About.InstanceUuid
$Id = $vm.Id.Replace("e-v","e:v")
"https://${vCenterServer}:9443/vsphere-client/vmrc/vmrc.jsp?vm=${Uuid}:${id}"
}
else{
$Id = $vm.Id.Replace("e-v","e|v")
“https://$vCenterServer/ui/?wsUrl=http://localhost:80/sdk&mo=${Id}&{inventory}=none&tabs=hide_”
}
} -Force | Out-Null
YellowFolderName
New-VIProperty -Name 'YellowFolderName' -ObjectType 'VirtualMachine' -Value {
param($vm)
$entity = Get-View $vm.ExtensionData.ResourcePool
while($entity.GetType().Name -ne 'Folder'){
$entity = Get-View $entity.Parent
}
$entity.Name
} -Force -BasedOnExtensionProperty 'ResourcePool'
YellowFolderName (recursive)
Sample of a recursive function.
New-VIProperty -Name 'YellowFolderName' -ObjectType 'VirtualMachine' -Value {
param($vm)
function Get-FirstFolder{
param($entityMoRef)
$entity = Get-View $entityMoRef
while($entity.GetType().Name -ne 'Folder'){
$entity = Get-FirstFolder $entity.Parent
}
$entity
}
(Get-FirstFolder $vm.ExtensionData.ResourcePool).Name
} -Force -BasedOnExtensionProperty 'ResourcePool'
VMHost
AvgCPUUsage24Hr
Credit: Hal Rottenberg
New-VIProperty -ObjectType VMHost -name AvgCPUUsage24Hr `
-Value {
“{0:f2}” -f ($Args[0] | `
Get-Stat -stat cpu.usage.average | `
where { $_.Instance -eq “” } | `
Measure-Object -Property Value -Average).Average
} `
-Force
ClusterName
Credit: Jonathan Medd
New-VIProperty -Name ClusterName -ObjectType VMHost `
-Value {
param($vmhost)
$vmhost.Parent.Name
} `
-Force
Hardware
New-VIProperty -Name 'Hardware' -ObjectType 'VMHost' ` -ValueFromExtensionProperty 'Hardware'
MemoryTotalGB
Credit: Jonathan Medd
New-VIProperty -Name MemoryTotalGB -ObjectType VMHost `
-Value {
param($vmhost)
[Math]::Round($vmhost.MemoryTotalMB/1KB,1)
} `
-Force
Number of powered on guests
Credit: FillDeeUK
New-VIProperty -ObjectType VMHost -name NumberOfPoweredOnVMs -Value {
($Args[0] | Get-VM | ?{$_.PowerState -eq “PoweredOn”} | Measure-Object).Count
} -Force
NumberOfVMs
Credit: Carter Shanklin
New-VIProperty -ObjectType VMHost -name NumberOfVMs `
-Value {($Args[0] | Get-VM | Measure-Object).Count } `
-Force
NumPoweredOnvCPUs
Credit: Alan Renouf
New-VIProperty -ObjectType VMHost -name NumPoweredOnvCPUs `
-Value {
$TotalvCPU = 0
$Args[0] | Get-VM | where { $_.PowerState -eq "PoweredOn" } | foreach {
$TotalvCPU += $_.NumCPU
}
$TotalvCPU
} -Force
NumvCPUs
Credit: Alan Renouf
New-VIProperty -ObjectType VMHost -name NumvCPUs `
-Value {
$TotalvCPU = 0
$Args[0] | Get-VM | foreach {
$TotalvCPU += $_.NumCPU
}
$TotalvCPU
} -Force


Thanks for putting this together and also to all those who contributed. It’s really cool and works.