我将此脚本保存在“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”也是不必要的?如果您知道这两个问题的答案,请告诉我。
答案 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
答案 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,如果有人没有输入正确的值等,你可以使用错误陷阱。
答案 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”只会加快该过程,并允许您在脚本中间进行操作。