Search code examples
loopsvbscriptkill-processwmi-service

vbscript check if multiple processes exist and kill them


I am trying to create a VBScript that kills 3 processes if they exist. cscript.exe wscript.exe and cmd.exe

It needs to run a kill command and then check if the process still exists to verify that the previous command worked before continuing. I added a sleep command to give the script time to work before re-checking.

I need this in case I make another VBScript that loops a command that ends up getting stuck infinitely. I plan to link this script to a hotkey as a lifesaver should that happen.

How can I add more processes to this?

' TK CSCRIPT & WSCRIPT & CMD

Set objWMIService = GetObject ("winmgmts:")
    foundProc = False
    procName1 = "cscript.exe"

For Each Process in objWMIService.InstancesOf ("Win32_Process")
    If StrComp(Process.Name,procName1,vbTextCompare) = 0 then
        foundProc = True
        procID = Process.ProcessId
    End If
Next
If foundProc = True Then
    Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)
    For Each objProcess in colProcessList
        objProcess.Terminate()
    Next
        WScript.Sleep(1000) 'wait 1 second before checking if the process still exists
    Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process where ProcessId =" &  procID)
    If colProcessList.count = 0 Then
    End If
End If

Solution

  • You can store what process did you want to kill into an Array like this code below :

    Option Explicit
    Dim Ws,fso,MyArray,LogFile,OutPut,count,MyProcess
    Set Ws = CreateObject("Wscript.Shell")
    Set fso = CreateObject("Scripting.FileSystemObject")
    MyArray = Array("cscript.exe","cmd.exe","wscript.exe","notepad.exe","mshta.exe")
    LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "log"
    count = 0 
    If fso.FileExists(LogFile) Then fso.DeleteFile LogFile
    Set OutPut = fso.OpenTextFile(LogFile,8,True)
    
    For Each MyProcess in MyArray
        Call Kill(MyProcess)
    Next
    
    OutPut.WriteLine String(50,"=") 
    OutPut.WriteLine count & " Process were killed !"
    OutPut.WriteLine String(50,"=")
    
    If fso.FileExists(LogFile) Then
        ws.run LogFile 'To show the LogFile
    End if
    '---------------------------------------------------------------------------------------------------
    Sub Kill(MyProcess)
    On Error Resume Next
        Dim colItems,objItem
        Set colItems = GetObject("winmgmts:").ExecQuery("Select * from Win32_Process " _
        & "Where Name like '%"& MyProcess &"%' AND NOT commandline like '%" & wsh.scriptname & "%'",,48)
        For Each objItem in colItems
            count= count + 1
            OutPut.WriteLine Mid(objItem.CommandLine,InStr(objItem.CommandLine,""" """) + 2)
            objItem.Terminate(0)
            If Err <> 0 Then
                OutPut.WriteLine Err.Description
            End If
        Next
    End Sub
    '---------------------------------------------------------------------------------------------------