我想知道如何根据其专用工作集内存使用情况来调整以下代码,以杀死特定进程(有多个同名进程)。
Get-Process myPROCESSNAME -ea 0 | where { $_.PM -le 10MB } | foreach {
$Path = $_.Path
if ($Path) {
Stop-Process $_ -Force
}
}
当我打开任务管理器时,可以清楚地看到要自动杀死的进程正在使用大约4 MB的RAM,而我不想杀死的进程使用了超过20MB的RAM。
我一直在摆弄C#控制台应用程序,但实际上并不能通过任务管理器看到相同的内存读数。 然后我意识到任务管理器会显示“专用工作集”内存(默认情况下),这就是我需要过滤出不良进程的原因。
这可以通过批处理/ PowerShell脚本来实现吗?
答案 0 :(得分:0)
您也可以批量进行。
@echo off
for /f "tokens=2" %%i in ('tasklist /FI "memusage lt 10000" ^|findstr /i "myPROCESSNAME"') do echo taskkill /PID %%i
这将执行任务列表,并获取内存使用量为l
t
大于10000kb(10mb)的进程。
然后,我们仅使用findstr使其适合您的进程(myPROCESSNAME),然后通过其PID
终止该进程。
注意,我添加了echo
。这是出于测试目的,因此您至少可以看到该命令在没有实际上执行任务的情况下将执行的操作。对结果满意后,请删除echo
,以实际执行taskkill
命令。
我建议您阅读上述命令的一些帮助:
for /?
findstr /?
tasklist /?
taskkill /?
答案 1 :(得分:0)
如果您确实希望使用Memory (Private Working Set)
,则可以使用powershell和Get-WmiObject
来获得该信息:
Get-WMIObject -Class Win32_PerfRawData_PerfProc_Process -Property IDProcess,Name,WorkingSetPrivate | `
Where-Object { $_.Name -Eq 'myPROCESSNAME' -And $_.WorkingSetPrivate -Lt 5242880 } | `
ForEach-Object { ( Get-Process -Id $_.IDProcess ).CloseMainWindow() }
请注意,您可能需要检查Name
的值是什么,它通常是可执行文件的名称,没有扩展名.exe
。在此示例中,我使用5MB
(即5242880字节)作为保持打开状态的最小大小。另外,出于本示例的目的,我使用了“友好的” CloseMainWindow
指令来关闭进程,具体取决于您的进程,您可能需要将其更改为更合适的内容。