Я пытаюсь сделать сценарий, который позволит мне убить несколько процессов, когда мне нужно максимум ресурсов. Вещи, которые я не против запустить, когда я запускаю 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 захватить больше, чем один процесс. Если кто-нибудь может просветить меня об этом, я буду очень счастлив :-)

2 ответа2

2

Это WQL ("SQL для WMI"). Это важно отметить, потому что они не идентичны. 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". По мере их циклического повторения в цикле "Для каждого" вы можете выбирать процесс для каждого процесса.

Чтобы прямо ответить на то, что ваш комментарий, кажется, просит:

Чтобы выбрать несколько конкретных процессов по имени в одном операторе Select, используйте оператор «ИЛИ»:

Select * from Win32_Process where Name = 'Process1' or Name = 'AnotherProcess'

0

Если дело дошло до этого ... Я бы просто поставил их в очередь ... один процесс за другим ... в том же формате, что и у вас.

   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 и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .