如何使用Powershell对进程名称进行分组并显示所使用的内存总和

问题描述

我正在努力将Powershell选项结合起来,以便生成一个简单的表,列出系统(服务器,个人计算机等)上的前10名内存用户。我的PC是Windows 7,由于Covid 19而没有现场时间表来升级到Windows10。我无法将应用程序添加到未经过审核过程的应用PC中(阅读,这需要花费很多时间),因此我大部分时间都在创建我自己的。

我想产生一个看起来像这样的结果:

以MB为单位计数名称内存总和


10 Firefox 5000 3个Javaw 1000

我想通过更改Powershell选项中的属性来选择的顺序。因此,例如,按计数,名称或内存排序。我的样品台不是一成不变的。

我遇到了以下两个Powershell,并且一直在尝试调整它们,但会出错。

(Get-Process | Measure-Object WorkingSet -sum).sum /1gb

 Get-Process | group-object -Property Name -NoElement | Where-Object {$_.Count -gt 1}

为了学习,我不介意看到“丑陋”版本和优化版本。

解决方法

您可以使用此:

$proc=ps|select -eXp name;$proc2=@()
$proc|%{
if(!("$($_)" -in $proc2)){$proc2+="$($_)"
$mem=0;ps $_|select -eXp workingSet|%{$mem+=$_/1MB}
[pscustomobject][ordered]@{
'Count'=(ps $_ -ea silentlyContinue).Count
'Name'=$_
'Memory in MB'=$mem
}}}
,

PowerShell v3中引入了PSCustomObject加速器,因此我不知道输出是否看起来像Windows 7中的表格,但是即使在PowerShell v2中,以下管道也可以返回所需的属性:

Get-Process |
  Group-Object -Property Name -NoElement |
    Where-Object { $_.Count -gt 1 } |
      ForEach-Object {
        [PSCustomObject]@{
            Count= $_.Count
            Name = $_.Name
            'Memory Sum in MB' = [math]::Round(( Get-Process -Name $_.Name |
                Measure-Object WorkingSet -sum).sum /1Mb,3)
        }
      }    # | Sort-Object -Property 'Memory Sum in MB'