Процессы убийства в Vbscript - PullRequest
0 голосов
/ 21 июля 2010

Я пытаюсь уничтожить все экземпляры процесса с именем «AetherBS.exe», но следующий VBscript не работает. Я не совсем уверен, где / почему это не удается.

Так как я могу убить весь процесс "AetherBS.exe?"

CloseAPP "AetherBS.exe"

Function CloseAPP(Appname)
    strComputer = "."
    Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
    Set colItems = objWMIService.ExecQuery( _
        "SELECT * FROM Win32_Process", , 48)
    For Each objItem In colItems
        If InStr(1,Ucase(objItem.Name),Appname) >= 1 Then
            objItem.Terminate
        End If
    Next
End Function

Ответы [ 3 ]

8 голосов
/ 21 июля 2010

Вот функция, чтобы убить процесс:

Sub KillProc( myProcess )
'Authors: Denis St-Pierre and Rob van der Woude
'Purpose: Kills a process and waits until it is truly dead

    Dim blnRunning, colProcesses, objProcess
    blnRunning = False

    Set colProcesses = GetObject( _
                       "winmgmts:{impersonationLevel=impersonate}" _
                       ).ExecQuery( "Select * From Win32_Process", , 48 )
    For Each objProcess in colProcesses
        If LCase( myProcess ) = LCase( objProcess.Name ) Then
            ' Confirm that the process was actually running
            blnRunning = True
            ' Get exact case for the actual process name
            myProcess  = objProcess.Name
            ' Kill all instances of the process
            objProcess.Terminate()
        End If
    Next

    If blnRunning Then
        ' Wait and make sure the process is terminated.
        ' Routine written by Denis St-Pierre.
        Do Until Not blnRunning
            Set colProcesses = GetObject( _
                               "winmgmts:{impersonationLevel=impersonate}" _
                               ).ExecQuery( "Select * From Win32_Process Where Name = '" _
                             & myProcess & "'" )
            WScript.Sleep 100 'Wait for 100 MilliSeconds
            If colProcesses.Count = 0 Then 'If no more processes are running, exit loop
                blnRunning = False
            End If
        Loop
        ' Display a message
        WScript.Echo myProcess & " was terminated"
    Else
        WScript.Echo "Process """ & myProcess & """ not found"
    End If
End Sub

Использование:

KillProc "AetherBS.exe"
4 голосов
/ 21 июля 2010

Проблема в следующей строке:

If InStr(1,Ucase(objItem.Name),Appname) >= 1 Then

Здесь вы конвертируете значение свойства Win32_Process.Name в верхний регистр, но не конвертируете Appname в верхний регистр. По умолчанию InStr выполняет поиск с учетом регистра, поэтому, если строки ввода совпадают, но различаются по регистру, совпадения не будет.

Чтобы решить эту проблему, вы также можете преобразовать Appname в верхний регистр:

If InStr(1, UCase(objItem.Name), UCase(Appname)) >= 1 Then

или вы можете использовать параметр vbTextCompare, чтобы игнорировать регистр букв:

If InStr(1, objItem.Name, Appname, vbTextCompare) >= 1 Then


Однако на самом деле в этой проверке нет никакой необходимости, поскольку вы можете включить ее непосредственно в свой запрос:

Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_Process WHERE Name='" & Appname & "'", , 48)
0 голосов
/ 07 августа 2014

Попробуйте ниже с пакетным скриптом

wmic path win32_process Where "Caption Like '%%AetherBS.exe%%'" Call Terminate

из строки cmd

wmic path win32_process Where "Caption Like '%AetherBS.exe%'" Call Terminate
...