powershell可通过get-counter配合hyper-v性能计数器路径获取虚拟交换机和网卡实时网络统计,如bytes received/sec、packets received discarded等,而get-vmnetworkadapter无法提供吞吐量与错误指标。
powershell 可以直接获取 hyper-v 虚拟交换机和虚拟网卡的实时网络统计信息,关键在于使用 get-counter 和性能计数器路径,而非仅依赖 get-vmnetworkadapter(后者不返回吞吐量、丢包等运行时指标)。
确认可用的 Hyper-V 网络性能计数器
Hyper-V 将网络统计暴露为 Windows 性能计数器,路径通常形如:\Hyper-V Virtual Network Adapter(*)\* 或 \Hyper-V Virtual Switch(*)\*
先列出所有相关计数器,确保目标存在:
- 运行
Get-Counter -ListSet "Hyper-V*" | Where-Object { $_.CounterSetName -match "Virtual Network|Virtual Switch" } - 常见有效计数器集包括:
Hyper-V Virtual Network Adapter(每张虚拟网卡)、Hyper-V Virtual Switch(每个 vSwitch) - 若返回为空,需确认 Hyper-V 管理工具已安装且性能计数器未被禁用(可运行
lodctr /R重载)
查询指定虚拟机网卡的实时流量与错误统计
以虚拟机 WebServer01 的默认网卡为例:
- 先获取该网卡在性能计数器中的实例名:
(Get-VMNetworkAdapter -VMName WebServer01).Name(通常为Network Adapter,但计数器中会显示为类似WebServer01/Network Adapter的完整实例) - 执行查询:
Get-Counter '\Hyper-V Virtual Network Adapter(WebServer01/Network Adapter)\Bytes Received/sec' -SampleInterval 1 -MaxSamples 3 - 常用计数器名称(括号内为典型用途):
•Bytes Received/sec(入向带宽)
•Bytes Sent/sec(出向带宽)
•Packets Received Discarded(接收丢弃包数)
•Packets Outbound Errors(发送错误包数)
批量获取多台虚拟机的网络活动汇总
适合快速筛查高流量或异常虚拟机:
- 获取所有已运行虚拟机的网卡实例列表:
$adapters = Get-VM | Where-Object State -eq 'Running' | ForEach-Object { Get-VMNetworkAdapter -VMName $_.Name } | Select-Object VMName, Name, IPAddresses - 构造计数器路径数组(注意空格和斜杠转义):
$counters = $adapters | ForEach-Object { "\Hyper-V Virtual Network Adapter($($_.VMName)/$($_.Name))\Bytes Received/sec", "\Hyper-V Virtual Network Adapter($($_.VMName)/$($_.Name))\Bytes Sent/sec" } - 一次性采集:
Get-Counter -Counter $counters -MaxSamples 1 | ForEach-Object { $_.CounterSamples | Select-Object Path, CookedValue }
导出历史趋势或持续监控
如需记录一段时间的数据(例如每5秒采样,持续1小时):
- 使用
-SampleInterval和-MaxSamples控制频率与总次数:Get-Counter '\Hyper-V Virtual Network Adapter(*)\Bytes Sent/sec' -SampleInterval 5 -MaxSamples 720 | Export-Counter -Path "C:\hv-net-stats.blg" - 生成的
.blg文件可用Import-Counter读取,或用 Windows 性能监视器(perfmon)图形化查看 - 注意:使用通配符
(*)会采集所有虚拟网卡,数据量较大,建议先确认实例数量避免性能影响










