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

时间:2010-05-10 21:52:16

标签: vbscript parameters execution arguments wsh

我将此脚本保存在“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”也是不必要的?如果您知道这两个问题的答案,请告诉我。

8 个答案:

答案 0 :(得分:123)

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

答案 1 :(得分:18)

在VBS内部,您可以使用

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

等等。参数个数:

Wscript.Arguments.Count

答案 2 :(得分:5)

通过命令行传递的每个参数都可以通过以下方式访问:Wscript.Arguments.Item(0)其中零是参数号:ie,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

答案 3 :(得分:2)

实际上,奖金问题的答案是“否”。 你不需要清理。 但是一般的编程习惯是要经常清理你的东西,比如晚餐后,请清理你的盘子。

答案 4 :(得分:2)

在教授新程序员时,应该正确回答“我应该清理吗?”永远是的。如果一个人习惯清理,那么人们就会清理干净。然后,当它实际需要时(以免造成堆乱,等等),清理是习惯并且会发生。

更好的问题是“如果我在这个脚本的末尾清理它会导致问题吗?”甚至更好......“假设我继续使用冗长的脚本(或者没有GC可用),这是清理这些对象的正确方法吗?”

我的两分钱。 保罗

答案 5 :(得分: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

答案 6 :(得分:0)

尝试此操作以获取所有Arg:

Set Args=WSH.Arguments
For x=0 To Args.Count-1
 WSH.Echo "Arg_"&x+1&" = "&Args(x)
Next

答案 7 :(得分:0)

要回答您的奖励问题,通常的回答是“否”,您不需要将简短的.VBS脚本(如Wscript或Cscript调用)中的变量设置为“ Nothing”。

在较长的脚本中执行此操作的原因是将内存释放回本来应该由VB保留的操作系统。如今,典型的8GB RAM和16GB +相对普遍的RAM不会产生任何可衡量的影响,即使在单个变量中具有几兆字节的巨大脚本中也是如此。从现在开始,您可能一直在使用1MB或2MB的RAM。

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