Get a process path with VBS

4.3k Views Asked by At

I want to kill a process with vbs, i know the command is :

oShell.Run "taskkill /im software.exe", , True

how to get software.exe path before we kill it ?

Because i want to launch software.exe again.

3

There are 3 best solutions below

1
On BEST ANSWER

WMI (can teminate as well):

dim wmi, list, process, path, shell

set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
set list = wmi.ExecQuery("Select * from Win32_Process") 
                  '// or "Select * from Win32_Process where name = 'xxxxxxx.exe'" allowing the removal of the if block

for each process in list
    if (lcase(process.name) = "xxxxxxx.exe") then
        path = process.ExecutablePath
        process.terminate()
        exit for
    end if
next

wscript.echo path

set shell = CreateObject("WScript.Shell")
shell.Run Chr(34) & path & Chr(34)
0
On

Give a try for this vbscript :

Option Explicit
Dim Titre,Copyright,fso,ws,NomFichierLog,temp,PathNomFichierLog,OutPut,Count,strComputer
If AppPrevInstance() Then 
    MsgBox "Il y a une instance déjà en cours" & VbCrLF & CommandLineLike(WScript.ScriptName),VbExclamation,"Il y a une instance déjà en cours"    
    WScript.Quit   
Else 
Copyright = "[© Hackoo © 2015 ]"
Set fso = CreateObject("Scripting.FileSystemObject")
Set ws = CreateObject( "Wscript.Shell" )
NomFichierLog="Killed Process.txt"
temp = ws.ExpandEnvironmentStrings("%temp%")
PathNomFichierLog = temp & "\" & NomFichierLog
Set OutPut = fso.CreateTextFile(temp & "\" & NomFichierLog,1)
strComputer = "."
    Call Find("wscript.exe")
    Call Explorer(PathNomFichierLog)
End If
'***************************************************************************************************
Function Explorer(File)
    Dim ws
    Set ws = CreateObject("wscript.shell")
    ws.run "Explorer "& File & "\",1,True
end Function
'***************************************************************************************************
Sub Find(MyProcess)
    Dim colItems,objItem,Processus,Question
    Titre = " Processus "& DblQuote(MyProcess) &" en cours d'exécution "
    Set colItems = GetObject("winmgmts:").ExecQuery("Select * from Win32_Process " _
    & "Where Name like '%"& MyProcess &"%' AND NOT commandline like " & CommandLineLike(WScript.ScriptFullName) & "",,48)
    Count = 0 
    For Each objItem in colItems
        Count= Count + 1
        'Processus = Mid(objItem.CommandLine,InStr(objItem.CommandLine,""" """) + 2) 'Extraction du chemin du script en ligne de commande
        Processus = objItem.CommandLine 'Replace(Processus,chr(34),"")
        Question = MsgBox ("Voulez-vous arrêter ce script : " & DblQuote(Processus) & " ?" ,VBYesNO+VbQuestion,Titre+Copyright)
        If Question = VbYes then
            objItem.Terminate(0)'Tuer ce processus
            OutPut.WriteLine Processus
        else
            Count= Count - 1 'décrementer le compteur de -1
        End if
    Next
OutPut.WriteLine String(100,"*")
OutPut.WriteLine count & Titre & "ont été arrêtés"
OutPut.WriteLine String(100,"*") & VbCrLF 
End Sub
'**************************************************************************
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
'**************************************************************************
Function AppPrevInstance()   
    With GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")   
        With .ExecQuery("SELECT * FROM Win32_Process WHERE CommandLine LIKE " & CommandLineLike(WScript.ScriptFullName) & _
            " AND CommandLine LIKE '%WScript%' OR CommandLine LIKE '%cscript%'")   
            AppPrevInstance = (.Count > 1)   
        End With   
    End With   
End Function   
'**************************************************************************
Sub Pause(Minutes)    
    Wscript.Sleep(Minutes*1000*60)    
End Sub   
'**************************************************************************
Function StripProcPath(ProcessPath)   
    Dim arrStr : arrStr = Split(ProcessPath, "\")   
    StripProcPath = arrStr(UBound(arrStr))   
End Function   
'**************************************************************************
Function CommandLineLike(ProcessPath)   
    ProcessPath = Replace(ProcessPath, "\", "\\")   
    CommandLineLike = "'%" & ProcessPath & "%'"   
End Function
'**************************************************************************

Or this :

Option Explicit
Dim Ws,fso,LogFile,Command,Execution
Set Ws = CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
LogFile = Left(Wscript.ScriptFullName,InstrRev(Wscript.ScriptFullName, ".")) & "log"
Call Kill("calc.exe")
ws.run LogFile
'****************************************************************************************************
Sub Kill(Process)
        Command = "Taskkill /F /IM "&Process&" > LogTmp.txt & Cmd /U /C Type LogTmp.txt > "&LogFile&" & Del LogTmp.txt"
        Call Executer(Command,0)
End Sub
'****************************************************************************************************
Function Executer(StrCmd,Console)
    Dim ws,MyCmd,Resultat
    Set ws = CreateObject("wscript.Shell")
'La valeur 0 pour cacher la console MS-DOS
    If Console = 0 Then
        MyCmd = "CMD /C " & StrCmd & ""
        Resultat = ws.run(MyCmd,Console,True)
        If Resultat = 0 Then
        Else
            MsgBox "Une erreur inconnue est survenue !",16,"Une erreur inconnue est survenue !"
        End If
    End If
'La valeur 1 pour montrer la console MS-DOS
    If Console = 1 Then
        MyCmd = "CMD /K " & StrCmd & ""
        Resultat = ws.run(MyCmd,Console,False)
        If Resultat = 0 Then
        Else
            MsgBox "Une erreur inconnue est survenue !",16,"Une erreur inconnue est survenue !"
        End If
    End If
    Executer = Resultat
End Function
'****************************************************************************************************
Function DblQuote(Str)
    DblQuote = Chr(34) & Str & Chr(34)
End Function
'****************************************************************************************************
0
On

To restart application with VBScript (close and open again)

and get application Path with more accuracy use CommandLine properties for Win32_Process.

and if you don't remember or know exactly application name in task manager use InStr.

'open google chrome explorer before you run this script
On Error Resume next
Dim processes, process, aPath, sh
Set processes=GetObject("winmgmts:\\.\root\cimv2").ExecQuery("Select * from Win32_Process") 
       
 For Each  process In processes
    If (InStr(1,process.CommandLine,"chrom",1)) > 0 Then ' "chrom" some letter form "chrome.exe"
         aPath = process.CommandLine
         process.Terminate()
         Exit For 
    End If 
 Next 
    
    Set sh = CreateObject("WScript.Shell")
    sh.Popup "App Path : "&aPath,2,"hello"
    sh.exec aPath

You can remove "chrom" and add any application name or some letter from its name to close it and reopen again.

This few code can do magic if you want to close and reopen specific instance from multi-instance open

For example you have multi text file open with notepad.exe and you want to close and reopen only one specific text and leave other open just remove "chrom" and add the name of this text you like to close and reopen again.
Same for multi script run with wscript.exe and you want close specific one script not all of them and reopen you can do the same type the name of this script instead of "chrom"