I want to calculate the bytes sent and recieved by a particular process .I want to use powershell for that. Something which I can do using Resource Monitor->Network Activity. How can i do that using get-counter?
2 回答
这里有一篇关于使用Get-Counter
cmdlet 的非常好的 Scripting Guy 文章:
诀窍是找到您需要的计数器,我认为您无法获得所需的粒度,因为这些计数器与 PerfMon 使用的计数器相同。它更关注整个网络接口,而不是使用该接口的单个进程。话虽如此,如果它是唯一使用给定接口的东西,它应该可以很好地完成这个技巧。
先看一下可用的网络接口选项:
(get-counter -list "Network Interface").paths
你不能,看来。我绝对找不到性能监视器正在读取的计数器,尽管其他人可能会插话。可能还有其他方法而不是 get-counter ,但这是您特别要求的。
查看计数器,您会发现最接近的是进程对象上的“IO Read Bytes/sec”和“IO Write Bytes/sec”计数器。
这些问题的问题在于,它们不仅仅计算网络活动。perfmon 中的描述说:
“此计数器计算进程生成的所有 I/O 活动,包括文件、网络和设备 I/O。”
话虽如此,如果您知道您只想监控或主要写入网络连接的进程,这可能比根本不测量任何东西要好。
你会这样做(我将使用 Chrome 作为示例,因为它现在可以方便地运行和使用数据):
get-counter "\Process(chrome*)\IO Read Bytes/sec"
这只会给你一次性阅读。如果您想继续阅读,可以添加连续开关。
返回的 PerformanceCounterSampleSet 对象并不完全适合使用,但您可以在 $obj.countersamples.cookedvalue 中找到实际读数。
该列表将相当长(如果您像我一样浏览)。Chrome 在许多单独的进程中运行,因此我们将做一些数学运算以将它们全部加起来,并以 KB 显示。
最后结果:
get-counter "\Process(chrome*)\IO Read Bytes/sec" -Continuous | foreach {
[math]::round((($_.countersamples.cookedvalue | measure -sum).sum / 1KB), 2)
}
运行它只会持续输出 Chrome 正在使用多少 KB/s 的读数。