So, the function:
<# .Description Function to get info about what VMs are on a virtual portgroup. vNugglets, Oct 2013 Highlights the use of the UpdateViewData() method of a .NET View object .Outputs PSObject #> function Get-VMOnNetworkPortGroup { param( ## name of network to get; regex pattern [parameter(Mandatory=$true)][string]$NetworkName_str ) ## end param ## get the .NET View objects for the network port groups whose label match the given name $arrNetworkViews = Get-View -ViewType Network -Property Name -Filter @{"Name" = $NetworkName_str} if (($arrNetworkViews | Measure-Object).Count -eq 0) {Write-Warning "No networks found matching name '$NetworkName_str'"; exit} ## get the networks' VMs' names, along with the name of the corresponding VMHost and cluster $arrNetworkViews | %{$_.UpdateViewData("Vm.Name","Vm.Runtime.Host.Name","Vm.Runtime.Host.Parent.Name")} ## create a new object for each VM on this network $arrNetworkViews | %{ $viewNetwk = $_ $viewNetwk.LinkedView.Vm | %{ New-Object -TypeName PSObject -Property @{ VMName = $_.Name NetworkName = $viewNetwk.Name VMHost = $_.Runtime.LinkedView.Host.Name Cluster = $_.Runtime.LinkedView.Host.LinkedView.Parent.Name } | Select-Object VMName,NetworkName,VMHost,Cluster } ## end foreach-object } ## end foreach-object } ## end fnAnd, some sample usage:
PS vN:\> Get-VMOnNetworkPortGroup -NetworkName "223|237" VMName NetworkName VMHost Cluster ------ ----------- ------ ------- dubuntu0 223.Prod esxi01.dom.com Cluster0 vma5 223.Prod esxi02.dom.com Cluster0 vcsa02 223.Prod esxi02.dom.com Cluster0 tmpl_test1 237.Dev esxi12.dom.com Cluster1 ...This illustrates the use of a regular expression pattern to match virtual networks whose names contain "223" or "237".
And, on the topic of speed increases:
## using standard cmdlets: PS vN:\> Measure-Command {Get-VirtualPortGroup -Name SomeNetworkName | Get-VM | select name,@{n="VMHostName"; e={$_.VMHost.name}},@{n="ClusterName"; e={$_.VMHost.Parent.Name}}} ... TotalSeconds : 25.4870345 ## using vNugglets function: PS vN:\> Measure-Command {Get-VMOnNetworkPortGroup -NetworkName SomeNetworkName} ... TotalSeconds : 0.9676149 ## big winner!So, while similar results can be had with native PowerCLI cmdlets, leveraging this function definitely comes in handy, especially when you are as impatient as we can be here at vNugglets. Enjoy!