You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 07:09:02