【问题标题】:powershell object sort descendingpowershell 对象降序排序
【发布时间】:2018-02-06 12:03:25
【问题描述】:

这个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
}

我还不够精通,不知道它是否真的在工作,但是因为项目是相加的,所以它是从第一个值中排序的,但是因为它仍然按字母顺序排序,我认为它只是没有设置为要排序的正确值。我已经尝试了几种不同的组合

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

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

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

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

即所有 chrome 进程都作为一个 --chrome 1650453708--

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

【问题讨论】:

    标签: powershell sorting


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      构建数据集然后排序。

      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
      ...
      

      【讨论】:

        【解决方案3】:

        不久前有人向我展示了使用 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
        

        【讨论】:

          猜你喜欢
          • 2021-08-06
          • 2016-09-05
          • 1970-01-01
          • 1970-01-01
          • 2021-03-07
          • 1970-01-01
          • 2017-10-13
          • 1970-01-01
          • 2021-09-06
          相关资源
          最近更新 更多