如何通过管道输出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的进程.希望这可以帮助!
小智 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]
:
$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
通过添加逻辑核心数量的动态检测来进一步改进之前的答案,以便将百分比调整回我们普通人期望看到的值,其中 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)
这里有几点需要注意:
$_
变量来引用当前来自管道的对象.第二,Powershell不使用%
表示百分比 - 而是%
表示模数运算符.所以,当你想要百分比时,你必须通过简单地乘以它来自己改变你的数字0.01
.
第三,Get-Process
cmdlet没有字段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)
尝试将它与前一个命令一起堆叠.
归档时间: |
|
查看次数: |
39878 次 |
最近记录: |