powershell对象降序

时间:2018-02-05 23:28:47

标签: powershell sorting

这个powershell的东西

$Processes = get-process | Group-Object -Property ProcessName
foreach($Process in $Processes)
{
    $Obj = New-Object psobject
    $Obj | Add-Member -MemberType NoteProperty -Name Name -Value $Process.Name
    $Obj | Add-Member -MemberType NoteProperty -Name Mem -Value ($Process.Group|Measure-Object WorkingSet -Sum).Sum
    $Obj | sort Mem -Descending
}

输出与此相同的

$Processes = get-process | Group-Object -Property ProcessName
foreach($Process in $Processes)
{
    $Obj = New-Object psobject
    $Obj | Add-Member -MemberType NoteProperty -Name Name -Value $Process.Name
    $Obj | Add-Member -MemberType NoteProperty -Name Mem -Value ($Process.Group|Measure-Object WorkingSet -Sum).Sum
    $Obj
}

我不熟悉它是否真的有效但是因为这些项目是相加的,所以它是从第一个值开始排序的,但是因为它仍然按字母顺序排序我觉得它不是&#39 ; t设置为正确的值进行排序。我已经尝试了几种不同的组合

sort,sort-object,sort-object -property" Mem" -Scending,Mem," Mem",WS," WS",WorkingSet,@ {Expression =" Mem&#34 ;; Descending = $ true}和各种排列,

将生成的$ Obj抛给另一个已排序的$ Obj(它抛出一个错误,说它没有添加$ ObjS + = $ obj | sort等)其他几种调用对象排序的方法我没有&#39保存或记住。

并得出结论,我的错误可能源于其他地方,但因为没有错误被抛出我相信我的语法至少是正确的。

我希望输出按进程的内存使用情况排序(按相同名称组合以获得类似进程的总内存,

即所有的chromes只处理一个--chrome 1650453708 -

这也适用于Windows 7的任何功能,如果这有帮助的话

3 个答案:

答案 0 :(得分:2)

这里有一个提示:你在这里排序什么?

foreach($Process in $Processes)
{
    #...
    $Obj | sort Mem -Descending
}

答案 1 :(得分:0)

构建数据集然后排序。

Function Get-ProcessMemorySummary1
{
    $Processes = Get-Process | Group-Object -Property ProcessName
    foreach($Process in $Processes)
    {
        $Obj = New-Object psobject
        $Obj | Add-Member -MemberType NoteProperty -Name Name -Value $Process.Name
        $Obj | Add-Member -MemberType NoteProperty -Name Mem -Value ($Process.Group `
             | Measure-Object WorkingSet -Sum).Sum
        $Obj | sort Mem -Descending
    }
}
Get-ProcessMemorySummary1 | Sort-Object Mem



Function Get-ProcessMemorySummary2
{
    $Processes = get-process | Group-Object -Property ProcessName
    foreach($Process in $Processes)
    {
        $Obj = New-Object psobject
        $Obj | Add-Member -MemberType NoteProperty -Name Name -Value $Process.Name
        $Obj | Add-Member -MemberType NoteProperty -Name Mem -Value ($Process.Group `
             | Measure-Object WorkingSet -Sum).Sum
        $Obj
    }
}

Get-ProcessMemorySummary2 | Sort-Object Mem

Name                         Mem
----                         ---
Idle                        8192
smss                     1277952
NisSrv                   1536000
ptim                     1765376
ptsrv                    1945600
ONENOTEM                 3014656
rundll32                 3084288
Secure System            3899392
ibtsiva                  4325376
SynTPHelper              4648960
fdlauncher               5128192
ssh-agent                5353472
ibmpmsvc                 5521408
fdhost                   6725632
...

Get-ProcessMemorySummary2 | Sort-Object Mem -Descending

Name                         Mem
----                         ---
iexplore              1890992128
svchost               1115009024
powershell_ise         834617344
RDCMan                 734556160
sqlservr               698155008
Microsoft.Photos       396951552
dwm                    346951680
MsMpEng                201469952
explorer               184778752
...

答案 2 :(得分:-1)

有人告诉我,使用Add-Member是一种资源匮乏。使用PSCustomObject为您提供可能更紧凑的代码,冗余更少,并允许轻松读取排序。

Get-Process | Group-Object -Property ProcessName | ForEach-Object {
[array]$objProcesses += [PSCustomObject][ordered] @{
    Name = $_.Name
    Mem = $(($_.Group | Measure-Object  WorkingSet -Sum).Sum)
}
}
Return $objProcesses