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


85

我将此脚本保存在“ 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在终止时自动执行此操作?也许“设置文件=什么都没有”和“设置FSO =什么都没有”也是不必要的吗?如果您知道这两个问题的答案,请告诉我。

Answers:


138

您可以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”?


宾果游戏就是这样!非常清楚,非常感谢。(奖金问题仍然悬而未决,以防有人想在这些评论之一中回答。)
彼得2010年

@Peter:我为您的奖金问题添加了一个简短的答案。
德克·沃尔玛

21

在VBS内部,您可以使用

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

等等。参数个数:

Wscript.Arguments.Count

谢谢!(奖金问题仍然悬而未决,以防有人想在这些评论之一中回答。)
彼得2010年

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,您可以在某些人未输入正确值的情况下进行错误陷阱,等等。

MS Technet示例


啊哈,谢谢你。有趣的是,您不必创建Wcript的实例。(奖金问题仍然悬而未决,以防有人想在其中一条评论中回答。)
彼得2010年

1)workFolder在以上答案或原始问题中均未定义为对象,因此Set workFolder = Nothing应引发错误。2)由于建议不要多次重复使用Argument,因此可以跳过将其分配给strFolder变量的操作。3)建议在x0Wscript.Arguments.Item(0)
2015年

实际上,除非设置了显式选项,否则不会引发错误,并且在这种情况下,由于未定义任何内容,因此不会起作用。关于变量,这是正确的,但是它不是必需的,那么FSO或FILE对象都不是,并且可以使用简单的with。可能有大量不同的方法... :)
unrealtrip'1

2

您还可以使用命名实参,这些实参是可选的,可以以任何顺序给出。

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 +相对普遍的RAM不会产生任何可衡量的影响,即使在单个变量中具有几兆字节的巨大脚本中也是如此。在这一点上,这可能是您可能需要使用1MB或2MB RAM的日子的保留。

没错,.VBS脚本完成后,所有变量都将被销毁,并且无论如何都将回收内存。将变量设置为“ Nothing”只会加快该过程,并允许您在脚本中间进行操作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.