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 fn
And, 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!
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.