问题描述
希望这个问题能让你身体健康,
我有一个 powershell 代码,将列出我计算机中内存消耗(以 mb 为单位)的所有进程,它现在运行良好,但问题是我想添加 -gt 操作以仅查找消耗大于例如 100mb
Get-Process | Select-Object Name,@{Name='WorkingSet(MB)';Expression={($_.ws / 1024kb)}} | format-table -autosize
这段代码的结果是:
Name WorkingSet(MB)
---- --------------
AppleMobileDeviceService 8.85546875
ApplicationFrameHost 32.40625
armsvc 3.6328125
atmgr 38.98828125
atmgr 38.83984375
audiodg 11.2109375
当我尝试添加 -gt 100mb 时:
PS C:\Users\Documents> Get-Process | Select-Object Name,@{Name='WorkingSet(MB)';Expression={($_.ws / 1024kb) -gt 100}} | format-table -autosize
Name WorkingSet(MB)
---- --------------
AppleMobileDeviceService False
ApplicationFrameHost True
armsvc False
atmgr False
所以结果是 True 还是 False,这不是我的期望,因为我只想让内存消耗超过 100 的进程(必须提到消耗不仅是对还是错:/)
解决这个问题后,我的计划是让脚本每隔一小时运行一次,并记录输出以防有超过 100mb 的进程使用,如果是,一旦我登录到笔记本电脑,就会出现一个弹出警告消息使用以下代码:
powershell -WindowStyle hidden -Command "& {[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Some Services are using more than 100mb of memory','WARNING')}"
我感谢任何想法或建议,
任何人都可以在这里提供帮助,我真的很感激。
解决方法
Where-Object 是根据对象的属性值过滤对象的常用方法。当您通过管道连接到 Select-Object
时,您会根据其选定或计算出的属性输出自定义对象。您可以过滤自定义对象,就像另一个 PowerShell 命令输出的任何其他对象一样。
Get-Process |
Select-Object Name,@{Name='WorkingSet(MB)';Expression={($_.ws / 1024kb)}} |
Where-Object { $_.'WorkingSet(MB)' -gt 100 } |
Format-Table -AutoSize
请注意,Format-Table
命令已移至表达式的末尾。 Format-*
命令应仅用于显示目的,因为它们会更改输入对象类型。
#您可以这样做以获取超过 100MB 的进程
Get-Process |
? {(($_.ws/1mb) -ge 100) -eq $true} |
select name,@{name = 'Memory';expression = {($_.ws/1mb)}}