Juicy
Juicy

Reputation: 12520

Starting a process in VBS: path not found

I need to make a simple vbs script to run some process' automatically. I found the following script on microsoft's website. It works fine to run notepad.exe the way the original example shows, but I'm trying to modify it to run myprog.exe. The full path to this program is: C:\myprogdir\myprog.exe

Const SW_NORMAL = 1
strComputer = "."
strCommand = "myprog.exe" 
strPath = "C:\myprogdir\"

Set objWMIService = GetObject("winmgmts:" _
    & "{impersonationLevel=impersonate}!\\" _
    & strComputer & "\root\cimv2")

' Configure the Notepad process to show a window
Set objStartup = objWMIService.Get("Win32_ProcessStartup")
Set objConfig = objStartup.SpawnInstance_
objConfig.ShowWindow = SW_NORMAL

' Create Notepad process
Set objProcess = objWMIService.Get("Win32_Process")
intReturn = objProcess.Create _
    (strCommand, strPath, objConfig, intProcessID)
If intReturn <> 0 Then
    Wscript.Echo "Process could not be created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Return value: " & intReturn
Else
    Wscript.Echo "Process created." & _
        vbNewLine & "Command line: " & strCommand & _
        vbNewLine & "Process ID: " & intProcessID
End If

I keep getting Return value: 9, which indicates "Path Not Found". However the path is correct. Is there something I'm not getting?

Upvotes: 0

Views: 2680

Answers (2)

Jobbo
Jobbo

Reputation: 1418

You don't need all that to start a process, you just need the Shell object. Also, be sure to wrap the path of your executable in quotes (in case the path has spaces). Like this:

Option Explicit

Dim shl

Set shl = CreateObject("Wscript.Shell")
Call shl.Run("""C:\myprogdir\myprog.exe""")
Set shl = Nothing

WScript.Quit

Upvotes: 1

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200273

Unless the path to your program is included in the system's %PATH% environment variable you need to specify the commandline with the full path to the executable. Specifying the path just as the working directory will not work.

strProgram = "myprog.exe" 
strPath    = "C:\myprogdir"

Set fso = CreateObject("Scripting.FileSystemObject")
strCommand = fso.BuildPath(strPath, strProgram)

...

intReturn = objProcess.Create(strCommand, strPath, objConfig, intProcessID)

Using the BuildPath method will save you the headaches caused by having to keep track of leading/trailing backslashes.

Note that you need to put double quotes around a path that contains spaces, e.g. like this:

strCommand = Chr(34) & fso.BuildPath(strPath, strProgram) & Chr(34)

As others have already pointed out, there are simpler ways to start a process on the local computer, like Run:

Set sh = CreateObject("WScript.Shell")
sh.Run strCommand, 1, True

or ShellExecute:

Set app = CreateObject("Shell.Application")
app.ShellExecute strCommand, , strPath, , 1

There are some notable differences between Run and ShellExecute, though. The former can be run either synchronously or asynchronously (which means the command either does or doesn't wait for the external program to terminate). The latter OTOH always runs asynchronously (i.e. the method returns immediately without waiting for the external program to terminate), but has the advantage that it can be used to launch programs with elevated privileges when UAC is enabled by specifying the verb "runas" as the 4th argument.

However, these methods only allow for launching processes on the local computer. If you want to be able to launch processes on remote computers you will have to use WMI:

strComputer = "otherhost"

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" _
  & strComputer & "\root\cimv2")

See here for more information about WMI connections to remote hosts.

Upvotes: 0

Related Questions