我可以帮助您翻译成中文:我能够向 VBScript 传递参数吗?(vbs 文件是由 cscript 启动的)

90

我有一个保存在 "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" 也是不必要的?如果您知道这两个问题的答案,请告诉我。
5个回答

147
你可以使用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对象。这只是您额外问题的简短答案,您可以在以下相关问题中找到更多信息:

需要在VBA函数内部将对象设置为Nothing吗?

在VB6中什么时候必须将变量设置为“Nothing”?


太好了,就是这样!非常清晰,非常感谢。 (如果有人想在这些评论中回答奖励问题,那么问题仍然开放。) - Peter
@Peter:我给你的奖励问题添加了一个简短的答案。 - Dirk Vollmar

26

在 VBS 中,您可以使用

访问参数。

Wscript.Arguments(0)
Wscript.Arguments(1)

等等。参数的数量:

Wscript.Arguments.Count

谢谢!(如果有人想在这些评论中回答奖励问题,那么奖励问题仍然开放。) - Peter

6
每个通过命令行传递的参数都可以通过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,您可以进行错误捕获,以防止某人未输入正确的值等。

微软技术网络的示例


啊哈,谢谢伙计。有趣的是你不必创建Wcript的实例。(如果有人想在这些评论中回答奖励问题,那么奖励问题仍然开放。) - Peter
  1. 在上述答案或原问题中,workFolder 未定义为对象,因此 Set workFolder = Nothing 应该会引发错误。
  2. 如果没有建议将参数重复使用多次,则可以跳过将其分配给 strFolder 变量。
  3. 建议在 Wscript.Arguments.Item(0) 中使用 x 而不是 0
- user66001
实际上,除非设置了Option Explicit选项,否则不会引发错误,在这种情况下,由于没有定义任何内容,因此什么也不起作用。这对于变量是正确的,但是它并不是必需的,同样FSO或FILE对象也不是必需的,可以使用简单的with语句。有很多不同的方法可供选择... :) - unrealtrip

5
您还可以使用命名参数,这些参数是可选的,并且可以按任意顺序给出。
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

0
回答你的奖励问题,一般来说,在像你这样由Wscript或Cscript调用的短.VBS脚本中,你不需要将变量设置为“Nothing”。
在较长的脚本中间这样做的原因是为了释放内存,否则VB会一直占用它。如今,8GB的RAM是典型的,16GB以上也相对常见,即使在一个具有几兆字节单个变量的巨大脚本上,这也不太可能产生任何可测量的影响。此时,这种做法已经过时了,因为你可能只使用1MB或2MB的RAM。
你是正确的,当你的.VBS脚本完成时,所有的变量都被销毁,内存也被回收。将变量设置为“Nothing”只是加速了这个过程,并允许你在脚本中间这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接