在powershell中按CPU使用百分比列出流程

Ulu*_*rak 4 powershell

如何通过管道输出Get-Process来使用CPU> 1%列出进程Where-Object

完全初学者到powershell所有我能想到的就是这样的

Get-Process | Where-Object { CPU_Usage -gt 1% }
Run Code Online (Sandbox Code Playgroud)

小智 19

如果需要CPU百分比,可以使用Get-Counter获取性能计数器,并且可以为所有进程运行Get-Counter.因此,列出使用超过5%CPU使用率的进程:

(Get-Counter '\Process(*)\% Processor Time').CounterSamples | Where-Object {$_.CookedValue -gt 5}
Run Code Online (Sandbox Code Playgroud)

这将列出在采样的实例中使用> 5%CPU的进程.希望这可以帮助!

  • 请注意,如果您有多个处理器,则任何单个进程以及 _total 的 CookedValue 都可能超过 100%。 (4认同)
  • 这应该是答案,而不是我的答案.+1反正:-) (3认同)
  • 结果中没有 ProcessId,这很烦人。 (2认同)

小智 8

我正在寻找一种解决方案来获取进程的 cpu、mem 利用率。我尝试了所有可以获得CPU的解决方案,但这些数字与任务管理器不匹配。所以我自己写了。以下将提供每个进程的准确 CPU 利用率。我在 I7 笔记本电脑上进行了测试。

\n
$Cores = (Get-WmiObject -class win32_processor -Property numberOfCores).numberOfCores;\n$LogicalProcessors = (Get-WmiObject \xe2\x80\x93class Win32_processor -Property NumberOfLogicalProcessors).NumberOfLogicalProcessors;\n$TotalMemory = (get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity})\n\n \n\n$DATA=get-process -IncludeUserName | select @{Name="Time"; Expression={(get-date(get-date).ToUniversalTime() -uformat "%s")}},`\n  ID,  StartTime,  Handles,WorkingSet, PeakPagedMemorySize,  PrivateMemorySize, VirtualMemorySize,`\n   @{Name="Total_RAM"; Expression={ ($TotalMemory )}},`\n  CPU,\n   @{Name='CPU_Usage'; Expression = { $TotalSec = (New-TimeSpan -Start $_.StartTime).TotalSeconds\n     [Math]::Round( ($_.CPU * 100 / $TotalSec) /$LogicalProcessors, 2) }},`\n   @{Name="Cores"; Expression={ ($Cores )}},`\n   @{Name="Logical_Cores"; Expression={ ($LogicalProcessors )}},`\n \n UserName, ProcessName, Path |  ConvertTo-Csv \n
Run Code Online (Sandbox Code Playgroud)\n

或者作为[pscustomobject]

\n
$cpu   = Get-WmiObject \xe2\x80\x93class Win32_processor -Property NumberOfCores, NumberOfLogicalProcessors\n$mem   = (Get-CimInstance -class cim_physicalmemory | measure capacity -sum).sum\n$epoch = get-date(get-date).ToUniversalTime() -uformat "%s"\n\nget-process -IncludeUserName | \n% { \n  if ($_.starttime -gt 0) {\n    $ts       = (New-TimeSpan -Start $_.StartTime -ea si).TotalSeconds\n    $cpuusage = [Math]::Round( $_.CPU * 100 / $ts / $cpu.numberoflogicalprocessors, 2)\n  } else {\n    $cpuusage = 0\n  }\n\n  [pscustomobject] @{\n    "Time"                = $epoch\n    "Total_RAM"           = $mem\n    "CPU_Usage"           = $cpuusage\n    "Cores"               = $cpu.numberofcores\n    "Logical Cores"       = $cpu.numberoflogicalprocessors\n    "UserName"            = $_.username\n    "ProcessName"         = $_.processname\n    "Path"                = $_.path\n    "CPU"                 = $_.CPU\n    "ID"                  = $_.ID\n    "StartTime"           = $_.StartTime\n    "Handles"             = $_.Handles\n    "WorkingSet"          = $_.WorkingSet\n    "PeakPagedMemorySize" = $_.PeakPagedMemorySize\n    "PrivateMemorySize"   = $_.PrivateMemorySize\n    "VirtualMemorySize"   = $_.VirtualMemorySize\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n


Dav*_*urg 8

通过添加逻辑核心数量的动态检测来进一步改进之前的答案,以便将百分比调整回我们普通人期望看到的值,其中 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)}}
Run Code Online (Sandbox Code Playgroud)

示例输出:

InstanceName CPU %
------------ -----
_total         100
idle           100
Run Code Online (Sandbox Code Playgroud)


dav*_*igh 7

这里有几点需要注意:

  • 首先,您必须使用该$_变量来引用当前来自管道的对象.
  • 第二,Powershell不使用%表示百分比 - 而是%表示模数运算符.所以,当你想要百分比时,你必须通过简单地乘以它来自己改变你的数字0.01.

  • 第三,Get-Processcmdlet没有字段CPU_Usage; 关于其输出的摘要可以在这里找到.关于该领域CPU的说法是:"该进程在所有处理器上使用的处理器时间量,以秒为单位." 所以要清楚你能从数字中得到什么.

总结命令可以写成

Get-Process | Where-Object { $_.CPU -gt 100 }
Run Code Online (Sandbox Code Playgroud)

这为您提供了使用超过100秒CPU时间的进程.

如果你想要一个类似于相对陈述的东西,你首先必须总结所有使用的时间,然后将实际时间除以总时间.您可以获得总CPU时间,例如

Get-Process | Select-Object -expand CPU | Measure-Object -Sum | Select-Object -expand Sum
Run Code Online (Sandbox Code Playgroud)

尝试将它与前一个命令一起堆叠.

  • 有什么方法可以获取进程使用的CPU百分比。它应该是任务管理器在 CPU % 列中显示的值。 (3认同)
  • 接受的答案带来了一些错误。你的答案更好!;) (2认同)