我正在努力做一个可以让我终止一些进程的脚本当我需要最大资源时。当我启动 XP 时,我不介意启动这些东西(dropbox、PowerISO、OpenOffice-tray 等),但由于它们每个都会占用一点内存,所以我想创建一个脚本,通过一次单击即可终止它们。
现在我的问题与 SQL 有关。我有一个脚本可以终止单个进程,如下所示:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'PWRISOVM.EXE'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
但我无法让 SELECT 语句抓取多个进程。如果有人能告诉我这一点,我会非常高兴 :-)
答案1
它是查询语言(“用于 WMI 的 SQL”)。这一点很重要,因为它们并不相同。WQL是旨在接近 SQL。:) 无论如何......
SELECT * FROM Win32_Process WHERE Name = 'PWRISOVM.EXE'
将仅选择具有特定名称“PWRISOVM.EXE”的进程。
Select * from Win32_Process
会给你一份完整的清单。
几年前,我为 Vista/7 编写了一个类似的脚本。创建一个要保留的进程数组,然后循环杀死没有依赖项的进程,跳过数组中的进程。然后再做一次,这将有助于先杀死所有子进程,然后杀死父进程。第三次传递应该“忽略它们是否有依赖项”并“强制”关闭;根据需要调整循环量。:)
对服务执行类似操作(“停止”它们前终止进程)。
根据我的经验,只需终止 Explorer.exe 即可恢复最多的资源。
并且不要忘记您的任务管理器、CMD 和脚本主机进程排除。;)
- 编辑: -
在您的示例代码中,如果您仅使用Select * from Win32_Process
它将把完整列表放入集合“colProcessList”中。当您在“For Each”循环中循环遍历它们时,您可以根据每个进程做出决定。
直接回答您的评论似乎要求的内容:
要在一个 Select 语句中按名称选择多个特定进程,请使用“OR”运算符:
Select * from Win32_Process where Name = 'Process1' or Name = 'AnotherProcess'
答案2
如果真的到了这一步...我会把它们排成一行...一个过程接着一个过程...按照和你那里完全相同的格式。
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'PWRISOVM1.EXE'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcessList = objWMIService.ExecQuery _
("SELECT * FROM Win32_Process WHERE Name = 'PWRISOVM2.EXE'")
For Each objProcess in colProcessList
objProcess.Terminate()
Next
3、4、5 等。