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
1 2 3 4 5 6 7 8 |
New-VIProperty -Name NumberOfHosts -ObjectType Cluster ` -Value { param($cluster) @($cluster.Extensiondata.Host).Count } ` -BasedOnExtensionProperty 'Host' ` -Force |
NumberOfVMs
1 2 3 4 5 6 7 8 9 |
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
1 2 3 4 5 |
New-VIProperty -Name NumberVmotions -ObjectType Cluster -Value { param($cluster) $cluster.ExtensionData.Summary.NumVmotions } -Force |
NumCPU
Credit: Alan Renouf
1 2 3 4 5 6 7 8 9 |
New-VIProperty -Name NumCPU -ObjectType Cluster ` -Value { $TotalPCPU = 0 $Args[0] | Get-VMHost | foreach { $TotalPCPU += $_.NumCPU } $TotalPCPU } -Force |
NumPoweredOnvCPUs
Credit: Alan Renouf
1 2 3 4 5 6 7 8 |
New-VIProperty -ObjectType Cluster -name NumPoweredOnvCPUs ` -Value { $TotalvCPU = 0 $Args[0] | Get-VMHost | foreach { $TotalvCPU += $_.NumPoweredOnvCPUs } $TotalvCPU } -Force |
NumvCPUs
Credit: Alan Renouf
1 2 3 4 5 6 7 8 |
New-VIProperty -Name NumvCPUs -ObjectType Cluster ` -Value { $TotalvCPU = 0 $Args[0] | Get-VMHost | foreach { $TotalvCPU += $_.NumvCPUs } $TotalvCPU } -Force |
Datastore
CapacityGB
1 2 3 4 5 6 7 |
New-VIProperty -Name CapacityGB -ObjectType Datastore ` -Value { param($ds) [Math]::Round($ds.CapacityMB/1KB,1) } ` -Force |
FreeGB
1 2 3 4 5 6 7 |
New-VIProperty -Name FreeGB -ObjectType Datastore ` -Value { param($ds) [Math]::Round($ds.FreeSpaceMb/1KB,1) } ` -Force |
NumberOfVMs
Credit: Robert van den Nieuwendijk
1 2 3 4 5 6 7 |
New-VIProperty -Name NumberOfVMs -ObjectType Datastore ` -Value { param($ds) $ds.ExtensionData.VM.Length } ` -Force |
PercentFree
Credit: Sean Duffy
1 2 3 4 5 |
New-VIProperty -Name PercentFree -ObjectType Datastore -Value { param($ds) "{0:P2}" -f ($ds.FreeSpaceMB/$ds.CapacityMB) } -Force |
ProvisionedGB
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 |
New-VIProperty -Name Datastore -ObjectType Harddisk -Value { param($hd) $hd.Filename.Split(']')[0].TrimStart('[') } -Force |
UnitNumber
1 2 |
New-VIProperty -Name UnitNumber -ObjectType Harddisk ` -ValueFromExtensionProperty 'UnitNumber' -Force |
PhysicalNic
LinkState
1 2 3 4 5 |
New-VIProperty -Name LinkState -ObjectType PhysicalNic -Value { param($nic) if($nic.Extensiondata.LinkSpeed){"up"}else{"down"} } -Force |
Portgroup
vCenterServer
1 2 3 4 5 |
New-VIProperty -Name vCenterServer ` -ObjectType DistributedPortgroup,VirtualPortgroup ` -Value { $Args[0].Uid.Split(':')[0].Split('@')[1] } -Force |
ScsiController
Harddisk
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 9 10 |
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
1 2 3 4 5 |
New-VIProperty -Name lunID -ObjectType ScsiLun -Value { param($lun) [int](Select-String ":L(?<lunID>\d+) <pre wp-pre-tag-17=""> |
quot; `
-InputObject $lun.RuntimeName).Matches[0].Groups[‘lunID’].Value
} -Force
Snapshot
Datacenter
Credit: Alan Renouf
1 2 3 4 5 |
New-VIProperty -Name "Datacenter" -ObjectType Snapshot ` -Value { param ($Snapshot) Get-Datacenter -VM ($Snapshot.VM) } -Force |
DaysOld
Credit: Alan Renouf
1 2 3 4 5 |
New-VIProperty -Name "DaysOld" -ObjectType Snapshot ` -Value { param ($Snapshot) ((Get-Date) - $Snapshot.Created).Days } -Force |
vCenter
Credit: Alan Renouf
1 2 3 4 5 |
New-VIProperty -Name "vCenter" -ObjectType Snapshot ` -Value { param ($Snapshot) ([Uri](Get-VM $Snapshot.VM).ExtensionData.Client.ServiceUrl).Host } -Force |
VirtualMachine
BootDelay
1 2 3 4 5 6 7 |
New-VIProperty -Name "BootDelay" -ObjectType VirtualMachine ` -Value { param($vm) $vm.ExtensionData.Config.BootOptions.BootDelay } -BasedOnExtensionProperty "Config.BootOptions" ` -Force |
BootTime
Credit: Robert van den Nieuwendijk
1 2 3 4 5 |
New-VIProperty -Name BootTime -ObjectType VirtualMachine ` -Value { param($vm) $vm.ExtensionData.Summary.Runtime.BootTime.ToLocalTime() } -Force |
CBTEnabled
Credit: Alan Renouf
1 2 3 |
New-VIProperty -Name CBTEnabled -ObjectType VirtualMachine ` -ValueFromExtensionProperty "Config.ChangeTrackingEnabled" ` -Force |
CpuHotAddEnabled
Credit: Hal Rottenberg
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 |
New-VIProperty -Name DNSName -ObjectType VirtualMachine -Value { param($vm) $vm.ExtensionData.Guest.Hostname } -BasedOnExtensionProperty "Guest.Hostname" -Force |
MemoryHotAddEnabled
Credit: Hal Rottenberg
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 |
New-VIProperty -Name MemReservation -ObjectType VirtualMachine ` -Value { param($vm) $vm.ExtensionData.Summary.Config.memoryReservation } -Force |
NumVirtualDisks
Credit: Alan Renouf
1 2 3 4 5 6 |
New-VIProperty -Name NumVirtualDisks -ObjectType VirtualMachine ` -Value { param($vm) $vm.ExtensionData.Summary.Config.numVirtualDisks } -Force |
OSName
Credit: Jonathan Medd
1 2 3 4 5 |
New-VIProperty -Name "OSName" -ObjectType VirtualMachine -Value { param($vm) $vm.ExtensionData.Guest.GuestFullName } -BasedOnExtensionProperty "Guest.GuestFullName" -Force |
SnapshotSpaceUsed
Ignore the warning about the ‘$_’ variable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
1 2 3 |
New-VIProperty -Name ToolsVersion -ObjectType VirtualMachine ` -ValueFromExtensionProperty ‘config.tools.ToolsVersion’ ` -Force |
ToolsVersionStatus
Credit: Hal Rottenberg
1 2 3 4 |
New-VIProperty -Name ToolsVersionStatus -ObjectType VirtualMachine -Value { param($vm) $vm.ExtensionData.Guest.ToolsVersionStatus } -Force |
vCenterServer
Credit: Robert van den Nieuwendijk
1 2 |
New-VIProperty -Name vCenterServer -ObjectType VirtualMachine ` -Value {$Args[0].Uid.Split(“:”)[0].Split(“@”)[1]} -Force |
VMCluster
Credit: Stevie.R
1 2 |
New-VIProperty -Name VMCluster -ObjectType VirtualMachine ` -Value {param($vm)($vm|Get-Cluster).Name} -Force |
VMIenabled
1 2 3 4 5 6 7 |
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
1 2 3 4 |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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=https://localhost:80/sdk&mo=${Id}&{inventory}=none&tabs=hide_” } } -Force | Out-Null |
YellowFolderName
1 2 3 4 5 6 7 8 9 |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 |
New-VIProperty -Name ClusterName -ObjectType VMHost ` -Value { param($vmhost) $vmhost.Parent.Name } ` -Force |
Hardware
1 2 |
New-VIProperty -Name 'Hardware' -ObjectType 'VMHost' ` -ValueFromExtensionProperty 'Hardware' |
MemoryTotalGB
Credit: Jonathan Medd
1 2 3 4 5 6 |
New-VIProperty -Name MemoryTotalGB -ObjectType VMHost ` -Value { param($vmhost) [Math]::Round($vmhost.MemoryTotalMB/1KB,1) } ` -Force |
Number of powered on guests
Credit: FillDeeUK
1 2 3 |
New-VIProperty -ObjectType VMHost -name NumberOfPoweredOnVMs -Value { ($Args[0] | Get-VM | ?{$_.PowerState -eq “PoweredOn”} | Measure-Object).Count } -Force |
NumberOfVMs
Credit: Carter Shanklin
1 2 3 |
New-VIProperty -ObjectType VMHost -name NumberOfVMs ` -Value {($Args[0] | Get-VM | Measure-Object).Count } ` -Force |
NumPoweredOnvCPUs
Credit: Alan Renouf
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 |
New-VIProperty -ObjectType VMHost -name NumvCPUs ` -Value { $TotalvCPU = 0 $Args[0] | Get-VM | foreach { $TotalvCPU += $_.NumCPU } $TotalvCPU } -Force |