如何使用CPU>列出进程?将Get-Process
的输出汇总到Where-Object
?
完成初学者到powershell所有我能想到的就是这样的
Get-Process | Where-Object { CPU_Usage -gt 1% }
答案 0 :(得分:14)
如果您想要CPU百分比,可以使用Get-Counter获取性能计数器,并且可以为所有进程运行Get-Counter。因此,列出使用超过5%CPU使用率的进程:
(Get-Counter '\Process(*)\% Processor Time').CounterSamples | Where-Object {$_.CookedValue -gt 5}
这将列出在采样样本的实例中使用> 5%CPU的进程。希望这有帮助!
答案 1 :(得分:7)
这里有几点需要注意:
%
变量来引用当前来自管道的对象。第二,Powershell不使用%
来表示百分比 - 而0.01
代表模数运算符。因此,当您需要百分比时,您必须通过简单地将其乘以Get-Process
来自行转换数字。
第三,CPU_Usage
cmdlet没有字段CPU
;可以找到其输出摘要Advanced Custom Styling Example here。关于字段Get-Process | Where-Object { $_.CPU -gt 100 }
说:"进程在所有处理器上使用的处理器时间量,以秒为单位。" 所以要清楚你能做什么期待数字。
汇总命令可以写成
Get-Process | Select-Object -expand CPU | Measure-Object -Sum | Select-Object -expand Sum
这为您提供了超过100秒CPU时间的过程。
如果您需要类似相对陈述的内容,首先必须总结所有使用的时间,然后将实际时间除以总时间。您可以获得总CPU时间,例如由
{{1}}
尝试将其与上一个命令一起堆叠。
答案 2 :(得分:1)
我一直在寻找一种解决方案,以按进程获取CPU和内存利用率。我尝试了所有可以在哪里获得CPU的解决方案,但这些数字与taskmanager不匹配。所以我写了我自己的。以下将提供每个过程的准确cpu利用率。我在I7笔记本电脑上进行了测试。
StringBuilder
答案 3 :(得分:0)
这个过程怎么样?
$sleepseconds = 1
$numcores = 4
$id = 5244
while($true) {
$cpu1 = (get-process -Id $id).cpu
sleep $sleepseconds
$cpu2 = (get-process -Id $id).cpu
[int](($cpu2 - $cpu1)/($numcores*$sleepseconds) * 100)
}
答案 4 :(得分:0)
除Get-Counter
外,您还可以使用Get-WmiObect
列出和过滤流程。
powershell "gwmi Win32_PerfFormattedData_PerfProc_Process -filter "PercentProcessorTime > 1" | Sort PercentProcessorTime -desc | ft Name, PercentProcessorTime"
或者,对于Get-Counter
,这是一个显示数字格式转换的示例,以摆脱CookedValue
的烦人小数位。
除了过滤之外,此示例还说明了排序,限制列和输出格式:
powershell "(Get-Counter '\Process(*)\% Processor Time').Countersamples | Where cookedvalue -gt 3 | Sort cookedvalue -Desc | ft -a instancename, @{Name='CPU %';Expr={[Math]::Round($_.CookedValue)}}"
Get-Process
不是正确的cmdlet,因为它不提供瞬时CPU利用率。
您还可以获得所有处理器的总负载:
powershell "gwmi win32_processor | Measure-Object LoadPercentage -Average | ft -h Average"
或者,
typeperf -sc 4 "\Processor(_Total)\% Processor Time"
答案 5 :(得分:0)
通过增加对逻辑核数量的动态检测来进一步改善先前的答案,以便可以将百分比调整回我们普通人希望看到的百分比,其中100%表示计算机的所有CPU带宽,并且没有值大于100%。包括一个设置为10%的过滤器,您可以对其进行适当调整。这种假设是,人们将对找到具有高过载处理器使用率的进程感兴趣,而不希望列出机器的众多空闲进程。
$NumberOfLogicalProcessors=(Get-WmiObject -class Win32_processor | Measure-Object -Sum NumberOfLogicalProcessors).Sum
(Get-Counter '\Process(*)\% Processor Time').Countersamples | Where cookedvalue -gt ($NumberOfLogicalProcessors*10) | Sort cookedvalue -Desc | ft -a instancename, @{Name='CPU %';Expr={[Math]::Round($_.CookedValue / $NumberOfLogicalProcessors)}}
示例输出:
InstanceName CPU %
------------ -----
_total 100
idle 100