【问题标题】:Run a vbscript from another vbscript从另一个 vbscript 运行 vbscript
【发布时间】:2009-11-06 09:29:05
【问题描述】:

如何让一个 vbscript 运行另一个 vbscript?

我想它只有几行代码,但之前没有尝试过这样做,两者之间没有任何传递,一个只需要调用/运行另一个。

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

谢谢 标记

【问题讨论】:

  • 我知道使用 .bat 可以做到,但在实际脚本中是否也没有办法做到这一点?
  • 试试这个:CreateObject("WScript.Shell").Run "Your-VBScript-Here"

标签: vbscript


【解决方案1】:

看看以下是否有效

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

objShell.Run "TestScript.vbs" 

' Using Set is mandatory
Set objShell = Nothing

【讨论】:

  • 试过这个,变量未定义,我还需要为它添加声明吗?
  • 忽略我的原始回复 - 这是垃圾。希望以上内容能解决您的问题。
  • 这种方法的问题在于它假定.vbs 与Windows 脚本主机(cscript.exewscript.exe)相关联。
【解决方案2】:

您可以尝试使用 Wshshell.Run 方法,该方法使您几乎无法控制从它开始的过程。或者您可以使用 WshShell.Exec 方法,它可以让您控制终止它、获取响应、传递更多参数(命令行参数除外)、获取状态等

使用运行(简单方法)

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 是确定窗口显示方式的整数。关于此和 WaitOnReturn 的更多信息可以在这里找到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 相同 READ RUN'S DESCRIPTION
ProgramArgs DITTO
ScriptEngine 您将用于执行脚本的引擎.由于 exec 方法需要一个 win32 应用程序,因此您需要指定它。通常是“WScript.exe”或“CScript.exe”。请注意,为了使用标准输入和标准输出(我们将在后面介绍这些内容),您必须选择“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 这是代表​​标准输出流的对象,它是READONLY,因此您可以使用Process.StdOut.ReadLine。这是被调用脚本将接收调用脚本的标准输入发送的任何信息的流。如果您使用标准输入的示例,则 StdOut.Readline 将返回“Hello Other Worlds”。如果没有可读取的内容,则脚本将在等待输出时挂起。这意味着脚本将显示为无响应
    注意:如果需要,您可以使用 ReadReadAll 而不是 ReadLine。如果您想读取 X 个字符,请使用 Read (X)。或者ReadAll,如果你想要剩下的信息流。
  7. 终止调用该方法强制终止进程。

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

【讨论】:

    【解决方案3】:

    为了完成,您可以发送 3 个这样的参数:

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

    【讨论】:

    • 谢谢,bairxy -- 这就是我要找的一些信息。
    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

      如果您不想对参数中的空格感到生气并想使用变量,请尝试以下操作:

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

      在哪里

      r=123
      c="Whatever comment you like"
      

      【讨论】:

      • 这里唯一有意义且不会因文件关联而误导的方法。
      【解决方案6】:

      我看到下面的代码工作。 很简单,但我想没有记录。 其他人使用“执行”命令吗?

         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
      

      【讨论】:

        【解决方案7】:

        试试这个。

        Option Explicit
        
        On error resume next
        Dim Shellobj
        Set Shellobj = CreateObject("WScript.Shell")
        
        Shellobj.Run "Test.vbs" 
        
        Set Shellobj = Nothing
        

        【讨论】:

          【解决方案8】:

          由于Martin's Answer 对我根本不起作用(“找不到文件”)并且atesio's Answer 不允许调用包含重复变量定义的两个脚本,所以这是另一个最终对我有用的替代方法:

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

          (Windows 8.1)

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-03-28
          • 1970-01-01
          • 2017-06-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-02
          相关资源
          最近更新 更多