PowerShell脚本:按对象大小(以MB为单位)排序

时间:2018-06-20 04:59:25

标签: powershell scripting

考虑以下PowerShell脚本:

Get-Process |
Select-Object @{Name='ID';Expression={$_.Id}}, @{Name='Process Name';Expression={$_.Name}},
@{Name='WS';Expression={"{0:N1}" -f($_.WorkingSet/1MB)}},
@{Name='Private';Expression={"{0:N1}" -f($_.PrivateMemorySize/1MB)}},
@{Name='Virtual';Expression={"{0:N1}" -f($_.VirtualMemorySize/1MB)}} | Sort-Object WS |
Format-Table -AutoSize

它似乎没有问题。但是,当我浏览结果时,我可以看到“工作集”对象的排序没有按预期进行(请注意,流程如何在“ 11.7”之前对“ 106.8”进行排序,就好像它是按第一个顺序排序一样)数字,然后是第二个,依此类推):

  ID Process Name          WS    Private Virtual
  -- ------------          --    ------- -------
1156 svchost               1.9   1.5     73.2   
 628 svchost               10.5  15.4    148.7  
 116 svchost               10.8  4.5     119.4  
 660 chrome                106.8 163.8   601.0  
5708 svchost               11.7  5.1     115.3

关于如何解决此问题的任何想法?

我也尝试过按“ WorkingSet”进行排序,如:

Sort-Object WorkingSet

尽管如此,结果还是没有对结果进行排序。

3 个答案:

答案 0 :(得分:3)

您应该将“排序对象”放在“选择对象”之前。

Get-Process | Sort-Object WS

这将为您提供所需的输出。

答案 1 :(得分:0)

您可以将一个属性保留在num中,以进行排序并在之后删除,例如:

Get-Process | %{

[pscustomobject]@{
    ID=$_.Id
    'Process Name'=$_.Name
    WS="{0:N1}" -f ($_.WorkingSet/1MB)
    Private="{0:N1}" -f ($_.PrivateMemorySize/1MB)
    Virtual="{0:N1}" -f ($_.VirtualMemorySize/1MB)
    WSNum=$_.WorkingSet
}


} | Sort WSNum | select * -ExcludeProperty WSNum |  ft -AutoSize

答案 2 :(得分:0)

您可以将变量保留为十进制的十进制形式:

Get-Process | %{

[pscustomobject]@{
    ID=$_.Id
    'Process Name'=$_.Name
    WS=[math]::Round($_.WorkingSet/1MB, 1)
    Private=[math]::Round($_.PrivateMemorySize/1MB, 1)
    Virtual=[math]::Round($_.VirtualMemorySize/1MB, 1)
}


} | Sort WS | ft -AutoSize