【问题标题】:Cannot use parentheses when calling a Sub Error 800A0414 VBS调用子错误 800A0414 VBS 时不能使用括号
【发布时间】:2013-02-15 19:41:23
【问题描述】:

我在该脚本的第 7 行和第 12 行收到 800A0414 错误:

Module Module1

  Dim p

    Sub Main()
        CreateObject("Wscript.Shell").Run("program.bat", 0, True)

        p = Process.GetProcessesByName("program")
        If p.Count > 0 Then
            WScript.Sleep(300000)
        Else
            CreateObject("Wscript.Shell").Run("program clean up.bat", 0, True)
        End If

    End Sub

    Private Function WScript() As Object
        Throw New NotImplementedException
    End Function

End Module

我正在尝试运行一个批处理脚本,它启动一个进程,然后等到该进程终止,然后运行另一个批处理脚本。我也不希望显示任何命令框。如果他们是更简单的方法,请告诉我。

感谢您的帮助

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    当您将过程的参数列表括在括号中时,您必须使用 Call 关键字:

    Call CreateObject("WScript.Shell").Run("program.bat", 0, True)
    

    如果省略 Call 关键字,还必须去掉括号:

    CreateObject("WScript.Shell").Run "program.bat", 0, True
    

    【讨论】:

    • 似乎有一个例外,如果你只使用第一个参数,它会让你使用括号。 IE。 CreateObject("Wscript.Shell").Run("program.bat") 无怨无悔地工作
    • @BeowulfNode42: .Run("program.bat") 是有效的语法 - 它被解释为 Call ...Run( ("program.bat") )。在特定参数周围加上括号会强制传递此参数ByVal 而不是ByRef。换句话说,MySub(param) 将在 sub 期待 ByVal 参数时起作用,但如果它期待 ByRef 参数则不起作用。详情请见ByRef and ByVal in VBScript
    【解决方案2】:

    完成之前所说的:

    当使用Call关键字调用过程(即子或函数)时,参数必须括在括号中,除外当过程没有参数时,括号是可选的。例如所有的语句:

    Call test()
    Call test
    Call test(1,2)
    

    有效,但不是这个:

    Call test 1
    

    不使用 Call 关键字调用过程时,在过程有零个或一个参数或过程有返回值 ( ie 是一个 function) 并且它的值在 same 语句中使用。例如所有的语句:

    test()
    test(1)
    test(1,2)
    a = test
    a = test(1,2)
    a = test(test(1,2),2)
    

    是有效的,除了第三个有多个参数。如果不清楚,最后一条语句中“test”的内部调用是有效的,因为它的返回值被用作另一个调用的参数。

    请注意,无论何时在本文中使用 圆括号,它也意味着暗示可能的 逗号 分隔值。

    【讨论】:

    • 注意:test(1)test 1 不同。它等效于Call test( (1) ),其中参数(不是参数列表)周围的括号强制传递参数ByVal 而不是ByRef。详情请见ByRef and ByVal in VBScript
    【解决方案3】:

    在我看来这是一个 VB.NET,而不是 VBScript 代码。 您在 VB.NET(和其他方法)中有 Shell function

    无论如何,Run 返回程序返回的任何错误代码,如果您 将结果存储在变量中,在这种情况下您可以使用括号。

    Dim lResult As Long
    lResult = CreateObject("Wscript.Shell").Run("program.bat", 0, True)
    

    其余的由@Helen 回答。

    【讨论】:

      猜你喜欢
      • 2023-02-05
      • 1970-01-01
      • 2023-03-23
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      相关资源
      最近更新 更多