For internal billing purpose I needed a way list all Windows VMs for a given subsidiary and their CPU and memory configuration.
Connect-VIServer -Server vcenter.corp.lan $var = get-vm -location Subsidiary1 | Where{ $_.Guest.OSFullName -like '*windows*' } | select numcpu, memorygb | Group-Object numcpu,memorygb function get-numOfVms { param ( [parameter(Mandatory = $true)] [pscustomobject]$VMs ) $results = foreach ($row in $var) { $cpu, $mem = $row.Name -split ',', 2 [pscustomobject]@{ NumOfVMs = $row.Count NumOfCPUs = $cpu MemoryGB = $mem.Trim() } } return $results } $total = get-numOfVms -VMs $var $total | Export-Csv -Path totalvms.csv -NoTypeInformation
Example of totalvms.csv. It gives you a number of each specific CPU and memory configuration.
"NumOfVMs","NumOfCPUs","MemoryGB" "1","2","8" "12","1","4" "4","4","8" "2","4","4" "9","1","8" "5","4","12" "22","4","32" "6","4","16" "2","1","12" "1","4","24" "1","1","16" "1","4","6" "1","1","6" "1","24","32" "1","4","25" "3","2","16" "1","8","6" "1","1","3"