PowerShell多IP执行Test-Connection按结果设置状态颜色问题求助
问题根因分析
第一版代码无法触发红色状态的原因
- 分支判断顺序错误:只要状态数组中存在
"False"就会命中黄色分支,全"False"的场景也满足-contains "False"的判断条件,永远不会走到红色分支 - 额外将布尔检测结果转为字符串存储,增加了不必要的逻辑开销
第二版代码类型报错的原因
-is是PowerShell中用于检测变量数据类型的运算符,右侧必须传入类型对象而非布尔值,$result -is $true试图将布尔值$true转为类型对象,因此触发类型转换报错- 混合状态判断逻辑错误:
$result -contains $false -and $true的实际运算规则等价于($result -contains $false) -and $true,只要存在检测失败的结果就返回真,无法区分「部分失败」和「全部失败」的场景 - 未使用互斥的
if/elseif分支,可能出现多个判断条件同时命中的异常
修复后可运行代码
# 优化IP获取逻辑,避免多网卡场景下取值异常,优先取非环回/非VPN的IPv4地址 $localIP = Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.PrefixOrigin -in "Manual", "Dhcp" -and $_.InterfaceAlias -notmatch "Loopback|VPN|Bluetooth" } | Select-Object -First 1 -ExpandProperty IPAddress $ipFirst3 = $localIP.Split(".")[0..2] -join "." # 构造待检测的ESXi IP列表 $checkIPList = @( "$ipFirst3.181", # ESXi Management "$ipFirst3.151", # ESXi Storage "$ipFirst3.71" # ESXi vMotion ) # 批量执行ping检测,返回布尔值数组 $pingResults = $checkIPList | ForEach-Object { Test-Connection $_ -Count 2 -Quiet -ErrorAction SilentlyContinue } # 按业务规则设置标签颜色 if (-not $pingResults.Contains($false)) { # 全部检测成功 → 绿色 $ESX1StatusLabel.BackColor = "Green" } elseif ($pingResults.Contains($true) -and $pingResults.Contains($false)) { # 同时存在成功和失败结果 → 黄色 $ESX1StatusLabel.BackColor = "Yellow" } else { # 全部检测失败 → 红色 $ESX1StatusLabel.BackColor = "Red" }
内容的提问来源于stack exchange,提问作者Fitzgery
相关产品推荐
相关产品推荐

