对那里的所有VBS大师......
我编写了一套VB脚本(用于自动安装,如果你必须知道),它们使用一组常用函数来记录,启动/停止服务等。
我想出了一个使用脚本的设计,该脚本包含类中的常用函数。它还声明并实例化类类型的变量 我还有一个'loader'脚本,它检查类对象是否存在,如果不存在,则运行类脚本。
我编写的每个脚本都包含对加载器的调用,然后我可以调用实例化类的方法。
这是一个非常简洁的解决方案(恕我直言),但我想知道是否有人有任何其他/更好的方法来实现同样的目标?
- 皮特
注意:这仅适用于.vbs文件中的VB脚本
答案 0 :(得分:0)
我们在VB5中实现了相同的目标。
在我们的应用程序中,VB脚本用于自定义业务规则甚至UI。有一个适当的文件结构,例如基类位于base \ folder。
当VB应用程序运行时,我们使用MSScript控件来运行脚本。初始化步骤是加载VBS文件的名称,并在内存中创建关联树。然后当VB需要调用某些脚本时,例如CreateNewCustomer(),一个引擎被告知它应该加载MSScript 2文件:CreateNewCustomer.vbs和base \ CreateNewCustomer.vbs
在这种情况下,我们实现了一些允许我们在VBScripts中使用继承的东西。
此外,对我们的COM类VBScriptEngine的引用也被传递给MSScript控件。 所以在任何VBScript中我们都可以调用VBScriptEngine.ExecuteScript(“CreateNewCustomer”,params),它又可以执行另一个VBScript
这项任务的挑战是我们不想创建和初始化太多的MSScript控件实例,但是当前脚本没有完成时,MSScript控件无法执行另一个脚本。所以在我们的VBScriptEngine中我们有脚本执行堆栈。如果任何VBScript需要调用另一个VBScript,我们需要创建一个新的MSScript控件并将其放入堆栈中。有时我们有嵌套调用,需要同时进行3个或更多MSScript控件
是的,现在看来,当.NET中的动态语言或动态程序集用来以更少的努力获得更好的结果时,这一切似乎都很奇怪。
答案 1 :(得分:0)
早在2006年,我使用“执行”和“OpenTextFile”提出了以下解决方案:
Execute library( "lib-util-1.0.4.vbs")
'---BEGIN--------------------------------------
logger left(getScriptName(),len(getScriptName())-4)&".log" : msgLog "" '-- blank line
msgLog "Running... ("&getScriptName()&")"
'<YOUR SCRIPT GOES HERE>
'-- fini
ExitProcess Null, 0
'---END----------------------------------------
'-- Import library into memory (2006.07.21/1.0.0/RRR)
Function library( ByVal libname)
dim libf:set libf=CreateObject("Scripting.FileSystemObject"):if not libf.fileExists(libname) then wscript.stdOut.write " Error: Could not locate library: "&libname:WScript.Quit( 1)
library=libf.OpenTextFile(libname,1).ReadAll()
End Function
更多示例位于此处:http://github.com/randollr/LVA