1

我有一个相当大的 VB 脚本项目,其中主要脚本“包含”许多“库”,使用读取文件内容并ExecuteGlobal在其上运行的标准技巧。一些库非常庞大,由各种第三方编写。

我想用Option Explicit. 但是,如果我将其作为执行的第一行,其中一些库就会崩溃。但是,如果我将指令移到我的包含列表下方,我会Expected Statement在该行遇到错误。更令人困惑的是,如果Option Explicit出现在其中一个库的顶部(在它们列表的中间),一切都很好。但是,我想从任何库中删除(或注释掉)并且只在我的实现脚本中强制执行限制。

Option Explicit关于必须出现在哪里的规则是什么?它必须是第一行吗?当我通过“包含”应用它时,为什么它不是第一行?我怎样才能实现我的目标?

代码示例:

Option Explicit  ' CAUSES RUNTIME ERROR IN A LIBRARY

Sub Include( sRelativeFilePath )    
    Dim oFs : Set oFs = CreateObject("Scripting.FileSystemObject")
    Dim sThisFolder : sThisFolder = oFs.GetParentFolderName( WScript.ScriptFullName )
    Dim sAbsFilePath : sAbsFilePath = oFs.BuildPath( sThisFolder, sRelativeFilePath )
    ExecuteGlobal oFs.openTextFile( sAbsFilePath ).readAll()
End Sub
Include ".\SomeLib.vbs"
Include ".\SomeOther.vbs"
Include ".\YetAnother.vbs"

VS

Sub Include( sRelativeFilePath )    
    Dim oFs : Set oFs = CreateObject("Scripting.FileSystemObject")
    Dim sThisFolder : sThisFolder = oFs.GetParentFolderName( WScript.ScriptFullName )
    Dim sAbsFilePath : sAbsFilePath = oFs.BuildPath( sThisFolder, sRelativeFilePath )
    ExecuteGlobal oFs.openTextFile( sAbsFilePath ).readAll()
End Sub
Include ".\SomeLib.vbs"
Include ".\SomeOther.vbs"
Include ".\YetAnother.vbs"

Option Explicit  ' CAUSES COMPILATION ERROR 
4

1 回答 1

2

Option Explicit关于必须出现在哪里的规则是什么?它必须是第一行吗?

根据文档

如果使用,Option Explicit 语句必须出现在脚本中的任何其他语句之前。

当我通过“包含”应用它时,为什么它不是第一行?

好吧,正如您所说,它并不是真正的“包括”,您只是在运行时加载文本并使用ExecuteGlobal评估单独的脚本。它不是替换脚本中库的文本,而是加载和运行单独的脚本。该单独的脚本可以Option Explicit作为第一个语句包含在其中,因为它是单独运行的。

我怎样才能实现我的目标?

为了与 一起运行Option Explicit,您需要确保所有库也声明所有变量。如果您不愿意找到变量名称并修改库以声明它们,那么我认为您没有其他选择。

您可以只让您的主要加载脚本脚本不使用 Option Explicit,以及任何比放入您自己的使用 Option Explicit 的库中更复杂的东西。希望您的主脚本足够简单,无需在其上使用 Option Explicit 即可轻松调试。

于 2018-04-18T17:01:08.567 回答