Where-Object cmdlet语法

时间:2013-10-15 20:51:33

标签: powershell syntax

我正在尝试学习如何在以下命令行中正确使用Where-Object来显示大于20兆字节的所有进程。

get-process | Select-Object Name, @{Name="Private Memory (MB)"; Expression={$_.privatememorysize / 1mb}} |
    Where-Object {"Private Memory (MB)" -gt 20} |
    Sort-Object "Private Memory (MB)" -Descending |
    format-table -autosize

我可以在下面的命令行中执行此操作。但是,我不想使用 20971520 bytes 指定它。我宁愿以兆字节为单位指定它。如果那是不可能的(或命令行会变得太复杂),那么我只想输出显示大于 20 MB的所有进程;即使我必须使用字节指定它:

get-process | Select-Object Name, @{Name="Private Memory (MB)"; Expression={$_.privatememorysize / 1mb}} |
    where-object {$_.privatememorysize -gt 20971520} |
    Sort-Object "Private Memory (MB)" -Descending |
    format-table -autosize

2 个答案:

答案 0 :(得分:1)

更改

where-object {"Private Memory (MB)" -gt 20}

where-object {$_."Private Memory (MB)" -gt 20}

get-process | 
    Select-Object Name, @{Name="Private Memory (MB)"; Expression={$_.privatememorysize / 1mb}} | 
    Where-Object {$_."Private Memory (MB)" -gt 20} | 
    Sort-Object "Private Memory (MB)" -Descending | 
    format-table -autosize

你可以在Where-Object表达式中使用20(vs 20mb)的原因是因为你已经在select语句中指定了度量单位。事实上,如果你使用20971520,它会认为你的意思是20971520 MB。

答案 1 :(得分:1)

您可以在PowerShell中直接指定尺寸:

PS C:\> 1KB
1024
PS C:\> 1MB
1048576
PS C:\> 1GB
1073741824

因此,当您想要执行数学运算时,可以在代码中使用它们。所以如果你想要做的就是替换那个文字,那就去吧:

$myProcesses = get-process | 
where-object { $_.privatememorysize -gt 20MB } | 
select-object name, @{ Name = "Private Memory (MB)"; Expression = {$_.privatememorysize / 1MB}} |
Sort-object "Private Memory (MB)" -Descending

注意:当对象准备输出以供用户读取时,您可能只想对对象使用format-table。因此,在这种情况下,一旦您准备将其输出到屏幕,您只需执行$myProcesses | format-table -autosize。如果您是从命令行执行此操作并且只是想尽快查看结果,那么请不要使用变量,并按照您的描述进行格式化。