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

PowerShell脚本if语句逻辑异常:网卡状态判断错误

问题分析:VM交换机组网卡状态判断脚本逻辑疏漏

问题现象

实际有一块网卡处于Disabled状态,但脚本仍输出正常提示,未进入预期的警告分支。

网卡实际状态

Get-NetAdapter

Name                      InterfaceDescription                    ifIndex Status       MacAddress             LinkSpeed
----                      --------------------                    ------- ------       ----------             ---------
Embedded FlexibleLOM ...2 HPE FlexFabric 10Gb 4-port 536FLR-...#2      10 Disabled     08-xxx-62        10 Gbps
Embedded FlexibleLOM ...1 HPE FlexFabric 10Gb 4-port 536FLR-...#4      11 Up           08-xxx-60        10 Gbps

原脚本代码

$vmswitch1stinterface = (Get-VMSwitchTeam -Name "Teaming").NetAdapterInterfaceDescription|select -first 1
$vmswitch2ndinterface = (Get-VMSwitchTeam -Name "Teaming").NetAdapterInterfaceDescription|select -last 1
$1stinterfacestatus = Get-NetAdapter -InterfaceDescription $vmswitch1stinterface|select Status
$2ndinterfacestatus = Get-NetAdapter -InterfaceDescription $vmswitch2ndinterface|select Status
if (($1stinterfacestatus -and $2ndinterfacestatus) -eq 'up') 
{
    Write-Host "OK: NIC ports are up (VMSwitch)"
    Exit 0
}   else 
{
    Write-Host "WARNING: An interface is down! Please check in the list which one is not UP:" 
    Get-NetAdapter -InterfaceDescription $vmswitch1stinterface|Select-Object InterfaceDescription, Status
    Get-NetAdapter -InterfaceDescription $vmswitch2ndinterface|Select-Object InterfaceDescription, Status
    Exit 1
}

变量实际值

$vmswitch1stinterface: HPE FlexFabric 10Gb 4-port 536FLR-T Adapter #4
$vmswitch2ndinterface: HPE FlexFabric 10Gb 4-port 536FLR-T Adapter #2

$1stinterfacestatus
Status
------
Up

$2ndinterfacestatus
Status
------
Disabled

错误输出

OK: NIC ports are up (VMSwitch)

核心逻辑疏漏

1. 对象与字符串混淆

$1stinterfacestatus和$2ndinterfacestatus是通过Select Status得到的自定义对象,不是直接的状态字符串。直接用对象参与比较时,PowerShell不会自动提取Status属性值进行判断。

2. 逻辑判断语法完全错误

原判断条件($1stinterfacestatus -and $2ndinterfacestatus) -eq 'up'存在两个致命问题:

  • -and在这里是对两个对象做布尔判断:只要对象非空就返回$true,所以无论网卡状态是什么,$1stinterfacestatus -and $2ndinterfacestatus的结果都是$true。
  • $true -eq 'up'会触发PowerShell的类型隐式转换:字符串'up'会被转为布尔值$true,最终整个条件判断结果为$true,导致脚本错误地进入正常分支。

修正后的脚本

# 一次性获取交换机组的所有网卡描述,避免重复调用Get-VMSwitchTeam
$vmSwitchAdapters = (Get-VMSwitchTeam -Name "Teaming").NetAdapterInterfaceDescription

# 获取每个网卡的实际状态(直接提取Status属性的字符串值)
$adapterStatuses = $vmSwitchAdapters | ForEach-Object {
    (Get-NetAdapter -InterfaceDescription $_).Status
}

# 判断所有网卡是否都处于Up状态
if ($adapterStatuses -notcontains 'Disabled' -and $adapterStatuses -notcontains 'Down') {
    Write-Host "OK: NIC ports are up (VMSwitch)"
    Exit 0
}
else {
    Write-Host "WARNING: An interface is down! Please check the list below:"
    Get-NetAdapter -InterfaceDescription $vmSwitchAdapters | Select-Object InterfaceDescription, Status
    Exit 1
}

修正要点

  • 直接提取Status属性值:用(Get-NetAdapter ...).Status替代Select Status,得到纯字符串的状态值,确保比较逻辑有效。
  • 简化代码逻辑:一次性获取所有网卡描述,批量处理状态,避免重复操作。
  • 严谨的状态判断:检查所有网卡状态是否不包含Disabled和Down,覆盖所有异常状态场景。

内容的提问来源于stack exchange,提问作者Badb0y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:55:18