在VBS中启动进程:找不到路径

时间:2013-11-20 10:45:35

标签: vbscript

我需要创建一个简单的vbs脚本来运行某个进程'自动。我在微软的网站上找到了以下脚本。它可以像原始示例所示的那样运行notepad.exe,但我尝试修改它以运行myprog.exe。该计划的完整途径是: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

我一直得到返回值:9,表示&#34;找不到路径&#34;。但是路径是正确的。有没有我没有得到的东西?

2 个答案:

答案 0 :(得分:1)

您不需要所有这些来启动进程,只需要Shell对象。另外,请确保将可执行文件的路径用引号括起来(如果路径有空格)。像这样:

Option Explicit

Dim shl

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

WScript.Quit

答案 1 :(得分:0)

除非程序的路径包含在系统的%PATH%环境变量中,否则您需要使用可执行文件的完整路径指定命令行。将路径指定为工作目录将不起作用。

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

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

...

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

使用BuildPath方法可以避免由于必须跟踪前导/尾随反斜杠而导致的麻烦。

请注意,您需要在包含空格的路径周围放置双引号,例如像这样:

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

正如其他人已经指出的那样,有更简单的方法可以在本地计算机上启动流程,例如Run

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

ShellExecute

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

RunShellExecute之间存在一些显着差异。前者可以同步或异步运行(这意味着命令要么等待或不等待外部程序终止)。后一个OTOH总是异步运行(即该方法立即返回而不等待外部程序终止),但具有以下优点:当通过指定动词"runas"启用UAC时,它可用于启动具有提升权限的程序作为4 th 的论点。

但是,这些方法仅允许在本地计算机上启动进程。如果您希望能够在远程计算机上启动进程,则必须使用WMI:

strComputer = "otherhost"

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

有关与远程主机的WMI连接的详细信息,请参阅here