windows powershell 显示 CPU 百分比和内存使用情况

windows powershell 显示 CPU 百分比和内存使用情况

我可以使用答案CPU 百分比

While(1) { $p = get-counter '\Process(*)\% Processor Time'; cls; 
$p.CounterSamples | sort -des CookedValue | select -f 15 | ft -a}

现在我遇到了无法同时显示计算机上任务的内存使用率和 CPU 百分比的问题。我知道会获取Get-Counter "\Process(*)\Working Set - Private"内存,但我希望同时显示任务、CPU 百分比和内存使用率。

更新 1:理想情况下,我希望能够在 powershell 中将其作为一组命令运行。我希望输出显示为:

Process Name CPU (%) Memory (MB) ------------ ------- -----------

在能够在 powershell 中显示这三个项目之后,我将尽力处理显示问题。

更新2:这部分代码提供了我想要的内容

while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process |
  select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
  ? {$_.Name -notmatch "^(idle|_total|system)$"} |
  Sort-Object -Property PercentProcessorTime -Descending|
  ft -AutoSize |
  Select-Object -First 15; start-sleep 5}

显示结果如下:

Name                   PercentProcessorTime IDProcess                   WSP(MB)
----                    -------------------- ---------                   -------
MicrosoftEdgeCP#3                          6     18972                        6 WmiPrvSE#3                                 6     27300                        7
svchost#22                                 0      7316                        1

唯一的缺点是它在显示一次信息后就失败了,我不知道为什么。有什么帮助吗?

更新:3

$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
    $tmp = Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | 
    select-object -property Name, @{Name = "CPU"; Expression = {($_.PercentProcessorTime/$cores)}}, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "Memory(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} |
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$"} |
    Sort-Object -Property CPU -Descending|
    Select-Object -First 15;
    cls;
    $tmp | Format-Table -Autosize -Property Name, CPU, PID, "Memory(MB)";
    Start-Sleep 5
}

满足了我的所有需求,并为我提供了一个未来发展的起点。表格格式化程序的问题是它format-table必须是最后一个。

答案1

还有另一种通过 WMI 查询性能计数器的方法,我认为这种方法可以满足您的要求。输出还包括进程 ID,这在跟踪具有多个实例的进程时很有用。它还使用所谓的“计算属性”将select-object工作集值从字节转换为兆字节。还请注意,4 核系统上的最大 CPU 是 400,而不是 100。因此,要获得总体利用率(最大值为 100),您需要将每个进程的 CPU 值除以核心数。

$cores = (Get-WmiObject Win32_Processor).NumberOfLogicalProcessors
while ($true) {
    Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | 
    Where-Object {$_.Name -notmatch "^(idle|_total|system)$" -and $_.PercentProcessorTime -gt 0} |
    Format-Table -Autosize -Property @{Name = "CPU"; Expression = {[int]($_.PercentProcessorTime/$cores)}}, Name, @{Name = "PID"; Expression = {$_.IDProcess}}, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}}
    Start-Sleep 5
}

CPU Name            PID WSP(MB)
--- ----      --------- -------
  1 chrome        12476      64
  2 wuauclt        7504       0
  3 SearchIndexer 10128      22
  4 TIworker      11380     102

答案2

while (1) {cls; Get-WmiObject Win32_PerfFormattedData_PerfProc_Process | select-object -property Name, PercentProcessorTime, IDProcess, @{"Name" = "WSP(MB)"; Expression = {[int]($_.WorkingSetPrivate/1mb)}} | ? {$_.Name -notmatch "^(idle|_total|system)$"} | Sort-Object -Property PercentProcessorTime -Descending| Select-Object -First 15 | ft Name, PercentProcessorTime, IDProcess, "WSP(MB)" -AutoSize; start-sleep 5}

这就是我要找的。感谢@Clayton 提供的出色起点。以下是每个部分的作用的说明。

while(1)=> 始终运行

cls=> 清除当前屏幕

Get-WmiObject=> 用于获取当前进程的所有信息

select-object=> 仅选择所需的数据列

? {$_.Name -notmatch "^(idle|_total|system)$"}=> 删除进程名称第一部分包含 idle、_total 或 system 的进程名称

Sort-Object=> 按 CPU 使用率降序排列进程

Select-Object=> 仅选择前 15 个项目(前 15 个 CPU 进程)

ft=> 提供带有列标题的表格格式并使用整个屏幕

start-sleep=> 让循环休眠,大约每 5 秒运行一次

相关内容