调用子错误 800A0414 VBS 时无法使用括号

Cannot use parentheses when calling a Sub Error 800A0414 VBS

提问人:Strong 提问时间:2/16/2013 更新时间:5/26/2016 访问量:89875

问:

我在此脚本的第 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

评论


答:

56赞 Helen 2/16/2013 #1

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

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

如果省略关键字,还必须删除括号:Call

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

评论

3赞 BeowulfNode42 12/8/2015
似乎有一个例外,如果您只使用第一个参数,它将允许您使用括号。即。 无怨无悔地工作CreateObject("Wscript.Shell").Run("program.bat")
1赞 Helen 12/8/2015
@BeowulfNode42:是有效的语法 - 它被解释为 .将括号括在特定参数两边会强制传递此参数,而不是 。换句话说,如果 sub 需要参数,则会起作用,但如果它需要参数,则不起作用。有关详细信息,请参阅 VBScript 中的 ByRef 和 ByVal.Run("program.bat")Call ...Run( ("program.bat") )ByValByRefMySub(param)ByValByRef
2赞 Panayot Karabakalov 2/16/2013 #2

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

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

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

其余的由@Helen回答。

12赞 Mohammad Amin Bandekhoda 12/28/2013 #3

要完成之前所说的内容,请执行以下操作:

Call 关键字用于调用过程(即 sub 或 function)时,参数必须括在括号中,除非过程没有参数,在这种情况下,括号是可选的。例如,所有语句:

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

是有效的,但不是这个:

Call test 1

在不使用 Call 关键字的情况下调用过程时,当过程具有零个或一个参数,或者过程具有返回值(即是一个函数)并且其值在同一语句中使用时,才能使用括号。例如,所有语句:

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

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

请注意,每当本文中使用号时,它也意味着可能用逗号分隔的值。

评论

1赞 Helen 10/14/2014
注意:与 不同。它等效于 ,其中参数(而不是参数列表)周围的括号强制传递参数而不是 。有关详细信息,请参阅 VBScript 中的 ByRef 和 ByValtest(1)test 1Call test( (1) )ByValByRef