I recently had trouble with ESXi network uplinks, and I combined a script to get all network uplink statues from Standard and Distributed switches connected to each ESXi host. This script will loop through all hosts and display the status of all virtual switch uplinks.
$esxi_hosts = Get-VMHost -State Connected,Maintenance | Sort-Object -Property Name
foreach ($esxi_host in $esxi_hosts) {
Write-Host "Checking host - $esxi_host" -ForegroundColor Green
try {
$esxcli = $esxi_host | Get-EsxCli -V2
# Get all standard switches
Write-Host "Getting standard switches"
$stantard_switches = $esxi_host | Get-VirtualSwitch -Standard
Write-Host "Checking standard switches"
foreach ($stantard_switch in $stantard_switches) {
$nics = ($stantard_switch).Nic | Sort-Object
foreach ($nic in $nics) {
$nic_status = $null
$nic_status = ($esxcli.network.nic.get.Invoke(@{nicname="$nic"})).LinkStatus
if ($nic_status -ne "Up") {
Write-Host "$esxi_host - $switch_name - $nic - $nic_status" -ForegroundColor Red
}
else {
Write-Host "$esxi_host - $stantard_switch - $nic - $nic_status"
}
}
}
### Get all distributed switches
Write-Host "Checking distributed switches"
$dist_switches = $esxcli.network.vswitch.dvs.vmware.list.Invoke()
foreach ($dist_switch in $dist_switches) {
$switch_name = $dist_switch.Name
$nics = ($dist_switch).Uplinks | Sort-Object
foreach ($nic in $nics) {
$nic_status = $null
$nic_status = ($esxcli.network.nic.get.Invoke(@{nicname="$nic"})).LinkStatus
if ($nic_status -ne "Up") {
Write-Host "$esxi_host - $switch_name - $nic - $nic_status" -ForegroundColor Red
}
else {
Write-Host "$esxi_host - $switch_name - $nic - $nic_status"
}
}
}
}
catch {
Write-Host "ERROR - failed to get NIC status info"
}
}