VIProperties

December 18th, 2011 Leave a comment Go to comments

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.

VIProperty 111111
VIProperty 111111
VIProperty_111111.zip
3.3 KiB
Details...

Feel free to forward me your New-VIProperty statements and I will include them in the list.


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
  1. Darryl
    June 10th, 2011 at 17:01 | #1

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