Windows 10任务管理器网络收发统计与PowerShell性能计数器实现探究
Hey,这问题问得好!刚好我对Windows性能计数器和任务管理器的底层实现有点了解,咱们来拆解下~
揭秘任务管理器网络数据的实现&PowerShell模拟方案
一、任务管理器的核心依赖:Windows性能计数器
Windows系统内置了一套**性能计数器(Performance Counters)**机制,专门负责收集系统、硬件、应用的各类性能数据。任务管理器「性能」选项卡里的网络「接收」「发送」数据,本质上就是实时读取了这两个关键计数器:
\Network Adapter(*)\Bytes Received/sec:每秒接收的字节数\Network Adapter(*)\Bytes Sent/sec:每秒发送的字节数
任务管理器只是把这些原始数值做了可视化处理,比如实时折线图、单位转换(字节/KB/MB),以及多适配器的数据聚合展示。
二、用PowerShell模拟的实验思路
你想到用PowerShell的Get-Counter来验证完全找对了路子!这个cmdlet就是微软提供的、用于读取性能计数器的官方工具。我把你那段未完成的代码补全,并拆解关键逻辑:
完整实验代码
# 获取本地计算机名称 $Computer = hostname # 定义脚本块:统计30次采样周期内的总接收字节数 $sndrecsum = { # 连续采样30次「每秒接收字节数」计数器 $counterResults = Get-Counter -Counter '\network adapter(*)\Bytes Received/sec' -MaxSamples 30 # 计算所有采样值的总和 ($counterResults.CounterSamples | Measure-Object CookedValue -Sum).Sum } # 将统计逻辑放入后台作业运行(避免阻塞当前会话) $backgroundJob = Start-Job -ScriptBlock $sndrecsum -Name NetworkReceiveStats # 等待作业完成并获取结果 Wait-Job $backgroundJob $totalReceivedBytes = Receive-Job $backgroundJob # 转换为更易读的MB单位输出 Write-Host "30次采样周期内总接收字节数:$totalReceivedBytes 字节 ($([math]::Round($totalReceivedBytes / 1MB, 2)) MB)" # 清理后台作业 Remove-Job $backgroundJob
关键代码解释
Get-Counter -Counter '\network adapter(*)\Bytes Received/sec':指定要读取的计数器路径,*代表匹配所有网络适配器;如果要指定某张网卡,把*换成具体适配器名称即可(比如\network adapter(WLAN)\Bytes Received/sec)。-MaxSamples 30:设置采样次数,这里会每隔1秒采集一次(默认采样间隔),共采集30次。CookedValue:这是计数器返回的校准后实际数值,区别于原始的RawValue,已经自动处理了计数器的基数和换算逻辑,直接用就行。- 后台作业:用
Start-Job把统计逻辑放到后台,适合长时间采样场景,不会卡住当前PowerShell窗口。
三、扩展:统计发送字节数
如果要模拟任务管理器的「发送」数据,只需要替换计数器路径即可,修改脚本块如下:
$sendSumScript = { $counterResults = Get-Counter -Counter '\network adapter(*)\Bytes Sent/sec' -MaxSamples 30 ($counterResults.CounterSamples | Measure-Object CookedValue -Sum).Sum }
本质上,任务管理器就是持续循环读取这两个计数器的实时值,然后每秒更新一次UI展示——和我们用PowerShell做的事情逻辑完全一致,只是它做了更流畅的实时渲染和用户友好的界面封装~
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

