从另一个vbscript运行vbscript

24

我该如何运行另一个vbscript脚本?

我想代码只需要几行,但是我以前没有尝试过这样做,两个脚本之间不传递任何东西,只需调用/运行另一个脚本。

例如,要运行的脚本名为TestScript.vbs,另一个要调用/运行的脚本名为Secondscript.vbs,两者都位于C:\Temp中。

谢谢 马克


我知道可以用 .bat 实现,但是脚本本身没有其他方法吗? - markdigi
1
尝试这个:CreateObject("WScript.Shell").Run "Your-VBScript-Here" - user9556248
8个回答

27

看看以下内容是否有效

Dim objShell
Set objShell = Wscript.CreateObject("WScript.Shell")

objShell.Run "TestScript.vbs" 

' Using Set is mandatory
Set objShell = Nothing

尝试了这个,变量未定义,我需要同时添加声明吗? - markdigi
请忽略我的原始回复 - 它是垃圾。希望上述内容能解决您的问题。 - Martin
这种方法的问题在于它假定.vbs与Windows脚本宿主(cscript.exewscript.exe)相关联。 - user692942

14

你可以尝试使用Wshshell.Run方法启动进程,但这种方法对进程的控制很少。或者你可以使用WshShell.Exec方法,它将使你有能力终止进程、获取响应、传递更多参数(而不仅仅是命令行参数)、获取状态以及其他操作。

使用Run(简单方法)

Dim ProgramPath, WshShell, ProgramArgs, WaitOnReturn,intWindowStyle
Set WshShell=CreateObject ("WScript.Shell")
ProgramPath="c:\test run script.vbs"
ProgramArgs="/hello /world"
intWindowStyle=1
WaitOnReturn=True
WshShell.Run Chr (34) & ProgramPath & Chr (34) & Space (1) & ProgramArgs,intWindowStyle, WaitOnReturn

ProgramPath是你想要运行的脚本的完整路径。
ProgramArgs是你想要传递给脚本的参数。(注意:如果你想使用包含空格的参数,那么你需要用引号将该参数括起来 [安全的方法是使用CHR (34)。例如:ProgramArgs= chr (34) & "/Hello World" & chr (34)])
IntWindowStyle是一个整数,用于确定窗口的显示方式。有关更多信息,请参见WshShell.Run Method
WaitOnReturn为true时,脚本将暂停直到命令终止,为false时则在启动命令后立即继续执行脚本。

注意:Run方法可以返回退出代码,但必须将WaitOnReturn设置为True,并将'WshShell.Run'赋值给一个变量。(例如:ExitCode=WshShell.Run (Command,intWindowStyle,True))

使用EXEC(高级方法):

Dim ProgramPath, WshShell, ProgramArgs, Process, ScriptEngine
Set WshShell=CreateObject ("WScript.Shell")
ProgramPath="c:\test run script.vbs"
ProgramArgs="/hello /world"
ScriptEngine="CScript.exe"
Set Process=WshShell.Exec (ScriptEngine & space (1) & Chr(34) & ProgramPath & Chr (34) & Space (1) & ProgramArgs)
Do While Process.Status=0
    'Currently Waiting on the program to finish execution.
    WScript.Sleep 300
Loop

ProgramPath与Run的描述相同。
ProgramArgs也是如此。
ScriptEngine执行脚本所使用的引擎。由于exec方法需要win32应用程序,因此您需要指定它。通常是“WScript.exe”或“CScript.exe”。请注意,为了使用stdin和stdout(稍后我们将介绍这些内容),您必须选择“CScript.exe”。

Process是引用脚本将启动的程序的对象。它有几个成员,它们是:ExitCode、ProcessID、Status、StdErr、StdIn、StdOut和Terminate。

有关Process Object成员的更多详细信息

  1. ExitCode是进程终止时返回的退出代码。
  2. ProcessID是分配给该进程的ID,每个进程都有一个唯一的ProcessID。
  3. Status是表示进程状态的代码数字,当进程终止时,它将被设置为“-1”。
  4. StdErr是表示标准错误流的对象。
  5. StdIn是表示标准输入流的对象,可用于编写要传递给调用脚本的其他参数或任何内容。(Process.StdIn.WriteLine "Hello Other Worlds"
  6. StdOut是表示标准输出流的对象。它是只读的,所以您可以使用Process.StdOut.ReadLine。这是调用脚本将接收由调用脚本的stdin发送的任何信息的流。如果使用了stdin的示例,则StdOut.Readline将返回“Hello Other Worlds”。如果没有要读取的内容,则脚本将挂起并等待输出。这意味着该脚本将显示为未响应
    注意:如果需要,您可以使用ReadReadAll代替ReadLine。如果要读取X个字符,请使用Read (X)。如果要读取流的其余部分,请使用ReadAll
  7. Terminate调用此方法以强制终止进程。

有关WshShell.Exec的更多信息,请转到Exec Method Windows Scripting Host


12

只是为了完整起见,您可以像这样发送3个参数:

objShell.Run "TestScript.vbs 42 ""an arg containing spaces"" foo" 

谢谢,blairxy——这就是我寻找的那一点信息。 - Smandoli

10

您还可以加载脚本的主体,并在同一进程中执行它:

Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile("script2.vbs")
body = ts.ReadAll
ts.Close
Execute body

3

如果你不想因为参数中的空格而感到烦恼,同时也想使用变量,请尝试以下方法:

objshell.run "cscript ""99 Writelog.vbs"" /r:" &  r & " /f:""" & wscript.scriptname & """ /c:""" & c & ""

where

r=123
c="Whatever comment you like"

在此处唯一可行且不会误导文件关联的方法。 - user692942

2

我看到下面的代码在工作。 很简单,但我猜没有记录。 还有其他人使用过“Execute”命令吗?

   Dim body, my_script_file
   Set Fso = CreateObject("Scripting.FileSystemObject")


   Set my_script_file = fso.OpenTextFile(FILE)
   body = my_script_file.ReadAll
    my_script_file.Close

    Execute body

2

试一试。

Option Explicit

On error resume next
Dim Shellobj
Set Shellobj = CreateObject("WScript.Shell")

Shellobj.Run "Test.vbs" 

Set Shellobj = Nothing

1

由于Martin的答案对我没有用(“文件未找到”),并且atesio的答案不允许调用两个包含重复变量定义的脚本,所以这里是另一个可行的选择,最终对我产生了作用:

filepath =  Chr(34) & "C:\...\helloworld.vbs" & Chr(34)
Set objshell= CreateObject("WScript.Shell") 
objshell.Run "wscript " & filepath, , True
Set objshell= Nothing

(Windows 8.1)

相信这个答案已经涵盖了它。 - user692942

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接