我可以将参数传递给 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代码?