<#  
.SYNOPSIS  
    Finds the local ESXi network Port-ID where a VM is assigned 
.DESCRIPTION 
    Reports back a VM's Port-ID according to the local ESXi host. This correlates to the Port-ID which is displayed via ESXTop
.NOTES  
    Author:  Kyle Ruddy, @kmruddy, thatcouldbeaproblem.com
.PARAMETER vm
	The name of the desired VM 
.EXAMPLE
	PS> .\Get-VMNetworkPortId.ps1 -vm vmname 
.EXAMPLE
	PS> Get-VM -Name vmname | .\Get-VMNetworkPortId.ps1 
#>
[CmdletBinding(SupportsShouldProcess=$True)] 
	param(
		[Parameter(Mandatory=$true,Position=0,ValueFromPipelineByPropertyName=$true)]
        [Alias('Name')]
		[String[]]$vm
  	)

    Begin {
		#Create an array to store output prior to return
		$output = @()
	
	}

	Process {
		#Loop through each of the input values
		foreach ($v in $vm) {
			#Validate the input is a valid VM
			$vmobj = Get-VM -Name $v -erroraction silentlycontinue
			if (!$vmobj) {Write-Verbose "No VM found by the name $v."}
			else {
				#Create a temporary object to store individual ouput
				$tempout = "" | select VM,PortId
				#Start an ESXCLI session with the host where the VM resides
				$esxcli = Get-EsxCli -VMHost $vmobj.VMHost -v2
				#ESXCLI call to obtain information about the VM, specifically its WorldID
				$vmNetInfo = $esxcli.network.vm.list.Invoke() | ?{$_.Name -eq $vmobj.Name}
				#Create spec to poll the host for the network information of the VM
				$portArgs = $esxcli.network.vm.port.list.CreateArgs()
				$portArgs.worldid = $vmNetInfo.WorldID
				#Output the values to the temporary object
				$tempout.VM = $vmobj.Name 
				$tempout.PortId = $esxcli.network.vm.port.list.Invoke($portArgs).PortId
				$output += $tempout
			}
		}
	}

    End {

        return $output

    }
