Querying vCenter for VM info using PowerShell - Too slow

51 Views Asked by At

Is it possible to make the below PowerShell code run faster?

 try {
    $ConnectionObject = Connect-VIServer -Server $vCenterServer -Credential $Cred -Force
} catch {}

if($ConnectionObject -and  $ConnectionObject.IsConnected){
    $AllVMs = Get-VM -Server $vCenterServer

    foreach($vm in $AllVMs) {
            $Cluster = Get-Cluster -VM $vm
            $NetworkAdapters = $vm | Get-NetworkAdapter
            $VMhost = Get-VMHost -VM $vm
            $PortGroups = $NetworkAdapters | Get-VDPortgroup
            #Other code goes here that processes the above 
    }
}  

At the moment it takes forever as there are about 1800 VMs.

1

There are 1 best solutions below

0
Minkulai On

I think you're after something like this:

try {
    $ConnectionObject = Connect-VIServer -Server $vCenterServer -Credential $Cred -Force
} catch {}

if ($ConnectionObject -and $ConnectionObject.IsConnected) {
    $AllVMs = Get-VM -Server $vCenterServer | Select-Object Name, VMHost, Parent
    $AllClusters = Get-Cluster -Server $vCenterServer
    $AllNetworks = Get-VDPortgroup -Server $vCenterServer
    $AllVMHosts = Get-VMHost -Server $vCenterServer

    foreach ($vm in $AllVMs) {
        $Cluster = $AllClusters | Where-Object { $_.Name -eq $vm.Parent }
        $NetworkAdapters = $AllNetworks | Where-Object { $_.VM -eq $vm.Name }
        $VMhost = $AllVMHosts | Where-Object { $_.Name -eq $vm.VMHost }
        # Other code goes here that processes the above
    }
}

Currently I can't test it but I'll be able to do some testing in 10 hours.