我可以将参数传递给 VBScript(使用 cscript 启动的 vbs 文件)吗?

Posted

技术标签:

【中文标题】我可以将参数传递给 VBScript(使用 cscript 启动的 vbs 文件)吗?【英文标题】:Can I pass an argument to a VBScript (vbs file launched with cscript)? 【发布时间】:2011-02-17 21:37:24 【问题描述】:

我有这个脚本保存在“test.vbs”中:

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(workFolder &"\test.txt", 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

当我运行脚本时,我想传递“workFolder”变量的值。

我该怎么做?我可以做吗?可能是“cscript test.vbs workFolder:'C:\temp\'”之类的东西?

额外问题:是否有必要使用“Set workFolder = Nothing”清理传递的变量,或者 VBSCript 在终止时会自动执行此操作吗?也许“Set File = Nothing”和“Set FSO = Nothing”也是不必要的?如果您知道这两个问题的答案,请告诉我。

【问题讨论】:

【参考方案1】:

您可以使用WScript.Arguments 访问传递给脚本的参数。

调用脚本:

cscript.exe test.vbs "C:\temp\"

在您的脚本中:

Set File = FSO.OpenTextFile(WScript.Arguments(0) &"\test.txt", 2, True)

不要忘记检查是否确实有参数传递给您的脚本。您可以通过检查Count 属性来做到这一点:

if WScript.Arguments.Count = 0 then
    WScript.Echo "Missing parameters"
end if

如果关闭文件后脚本结束,则无需将变量设置为Nothing。当 cscript.exe 进程终止时,资源将被自动清理。将变量设置为Nothing 通常只有在您明确希望在脚本执行期间释放资源时才需要。在这种情况下,您可以将包含对 COM 对象的引用的变量设置为 Nothing,这将在脚本终止之前释放 COM 对象。这只是对您的附加问题的简短回答,您将在这些相关问题中找到更多信息:

Is there a need to set Objects to Nothing inside VBA Functions

When must I set a variable to “Nothing” in VB6?

【讨论】:

宾果游戏,就是这样!很清楚,非常感谢。 (如果有人想在这些 cmets 中回答它,奖金问题仍然是开放的。) @Peter:我为你的额外问题添加了一个简短的答案。【参考方案2】:

在 VBS 内部,您可以使用

访问参数
Wscript.Arguments(0)
Wscript.Arguments(1)

等等。参数个数:

Wscript.Arguments.Count

【讨论】:

谢谢! (如果有人想在这些 cmets 中回答它,奖金问题仍然是开放的。)【参考方案3】:

通过命令行传递的每个参数都可以通过以下方式访问:Wscript.Arguments.Item(0) 其中零是参数编号:即 0、1、2、3 等。

所以在你的代码中你可以有:

strFolder = Wscript.Arguments.Item(0) 

Set FSO = CreateObject("Scripting.FileSystemObject")
Set File = FSO.OpenTextFile(strFolder, 2, True)
File.Write "testing"
File.Close
Set File = Nothing
Set FSO = Nothing
Set workFolder = Nothing

使用 wscript.arguments.count,您可以在有人没有输入正确的值等情况下进行错误陷阱。

MS Technet examples

【讨论】:

啊哈,谢谢伙计。有趣的是,您不必创建 Wcript 的实例。 (如果有人想在这些 cmets 中回答它,奖金问题仍然是开放的。) 1) workFolder 在上述答案或原始问题中均未定义为对象,因此 Set workFolder = Nothing 应引发错误。 2) 由于不建议将 Argument 重复使用一次以上,因此可能跳过将其分配给 strFolder 变量。 3)建议在Wscript.Arguments.Item(0)中使用x而不是0 实际上,除非设置了显式选项,否则它不会引发错误,在这种情况下,由于没有定义任何内容,因此什么都不会起作用。然而,变量确实如此,它不是必需的,那么 FSO 或 FILE 对象也不是,并且可以使用简单的 with 。可能有很多不同的方法...... :)【参考方案4】:

您还可以使用 命名参数,它们是可选的,可以按任意顺序给出。

Set namedArguments = WScript.Arguments.Named

这是一个小辅助函数:

Function GetNamedArgument(ByVal argumentName, ByVal defaultValue)
  If WScript.Arguments.Named.Exists(argumentName) Then
    GetNamedArgument = WScript.Arguments.Named.Item(argumentName) 
  Else  
    GetNamedArgument = defaultValue
  End If
End Function

VBS 示例:

'[test.vbs]
testArg = GetNamedArgument("testArg", "-unknown-")
wscript.Echo now &": "& testArg

示例用法:

test.vbs /testArg:123

【讨论】:

【参考方案5】:

要回答您的额外问题,一般答案是否定的,您不需要将变量设置为“Nothing”,简而言之,像您这样由 Wscript 或 Cscript 调用的 VBS 脚本。

您可能在较长的脚本中间执行此操作的原因是为了将内存释放回 VB 本来会持有的操作系​​统。如今,8GB RAM 是典型的,16GB+ 相对普遍,这不太可能产生任何可衡量的影响,即使是在单个变量中有几兆字节的巨大脚本上也是如此。在这一点上,这有点像您在 1MB 或 2MB RAM 中工作的日子。

您是对的,当您的 .VBS 脚本完成时,您的所有变量都会被销毁,并且无论如何都会回收内存。将变量设置为“无”只会加速该过程,并允许您在脚本中间执行此操作。

【讨论】:

以上是关于我可以将参数传递给 VBScript(使用 cscript 启动的 vbs 文件)吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ShellExecute 从 VBScript 将参数传递给批处理文件 [重复]

如何将值从Visual Basic 6程序传递给VBscript代码?

如何将参数传递给 erlang os:cmd()?

将参数传递给路由保护

如何使用 SwiftUI 将参数传递给 Button 的操作

OBIEE 使用 URL 将参数传递给分析