PowerShell通过Get-Counter读取“Network Interface”性能计数器的Errors Received/sec和Errors Sent/sec,获取网卡实时错误帧速率;需先用Get-NetAdapter确认准确网卡名,CookedValue值持续>0.1即提示链路异常。
直接用 powershell 查网卡的实时错误帧数,核心是读取 windows 性能计数器中的 network interface 类别下的 errors received/sec 和 errors sent/sec 两个指标。它们对应物理网卡接收和发送过程中产生的错误帧(如 crc 错误、对齐错误、超长/超短帧等),是判断网卡硬件或链路质量的关键信号。
确认目标网卡名称
错误帧数按网卡实例统计,必须先知道准确的网卡显示名称:
- 运行 Get-NetAdapter | Where-Object {$_.Status -eq 'Up'} | Select-Object Name, InterfaceDescription,查看当前启用的网卡名(如 Ethernet、vEthernet (Default Switch) 或具体型号名)
- 注意:不能用“本地连接”这类旧式名称,要以 Get-NetAdapter 输出的 Name 列为准
- 若名称含空格或特殊字符,后续计数器路径中需用英文引号包裹,例如 "Ethernet"
获取单次错误帧速率
执行一次采样,获得当前每秒错误帧数(非累计值):
- Get-Counter "\Network Interface(Ethernet)\Errors Received/sec" —— 接收错误帧速率
- Get-Counter "\Network Interface(Ethernet)\Errors Sent/sec" —— 发送错误帧速率
- 返回结果中 CookedValue 字段即为实时数值(单位:帧/秒),正常应长期稳定在 0.0;持续 >0.1 表示链路异常
- 可合并查询:$c = '\Network Interface(Ethernet)\Errors Received/sec','\Network Interface(Ethernet)\Errors Sent/sec'; Get-Counter -Counter $c | %{$_.CounterSamples | Select-Object Path,CookedValue}
持续监控并告警
不建议人工轮询,可用循环脚本自动检测并触发响应:
- 每 5 秒检查一次,连续 3 次 ≥ 0.5 就记录日志并弹窗提醒:
$nic = "Ethernet"; $threshold = 0.5; $count = 0; while($true) { $errIn = (Get-Counter "\Network Interface($nic)\Errors Received/sec").CounterSamples.CookedValue; if($errIn -ge $threshold) { $count++; if($count -ge 3) { Write-EventLog -LogName Application -Source "PSMonitor" -EntryType Warning -EventId 999 -Message "NIC '$nic' received $errIn errors/sec for 3 checks"; [System.Windows.Forms.MessageBox]::Show("网卡异常:$nic 错误帧过高"); break } } else { $count = 0 }; Start-Sleep -Seconds 5 } - 需提前运行 注册日志源
- 弹窗依赖 System.Windows.Forms,服务器若无桌面环境,可改用邮件或写入文件
补充说明
该计数器反映的是驱动上报的底层错误,比 ping 或 TCP 连接更早暴露问题。但要注意:
- 虚拟网卡(如 Hyper-V vSwitch)、WiFi 适配器也会上报此值,需结合 Get-NetAdapter -Physical 过滤纯物理网卡
- 某些老旧网卡驱动可能不完整支持该计数器,表现为返回 No data,此时可退而求其次查 \Network Interface(*)\Packets Received Errors(累计值)并做差分计算
- 若发现某网卡持续报错,优先排查网线、交换机端口、双工模式匹配(如一端强制千兆全双工,另一端自协商失败)


















