2009-06-30 33 views
0

要将所有VBS大师那里...理念,让公共代码

我已经写了一套VB脚本(用于自动安装,如果你必须知道),它使用一组常用功能对于像日志记录,启动/停止服务等东西。

我想出了一个使用脚本的设计,该脚本包含一个类中的常用功能。它还声明和实例化类类型的变量。
我也有一个'loader'脚本,用于检查类对象是否存在,如果不存在,则运行类脚本。

我编写的每个脚本都包含对加载器的调用,然后我可以调用实例化类的方法。

这是一个相当整洁的解决方案(恕我直言),但我想知道如果有人有任何其他/更好的方式实现相同?

- 皮特

注:这仅适用于VB脚本的.vbs文件

+0

听起来很整齐,听起来很复杂也是如此。你可能已经处理的一件事是确保所有的路径都是相对的,所以你可以移动装载程序和不在附近的东西。 – JoshBerke 2009-06-30 18:07:26

+0

干杯乔希。我曾尝试过,但是当脚本包含另一个脚本(使用.OpenTextFile)时,Wscript。包含脚本中的ScriptFullName将返回调用脚本的路径,而不是调用脚本的路径,因此除非相对于调用脚本,否则不可能相对调用任何内容,除非更改当前目录,而我不想这样做它可能会影响其他程序。 这听起来很复杂,但实际上很简单,并允许建立一个有用的库 – FrinkTheBrave 2009-07-17 09:53:45

回答

0

我们在VB5实现相同。

在我们的应用程序中,VB脚本用于自定义业务规则甚至UI。有一个合适的文件结构,例如基类位于base \文件夹中。

当VB应用程序运行时,我们使用MSScript控件来运行脚本。初始化步骤是加载VBS文件的名称并在内存中创建一个关联树。然后,当VB需要调用某个脚本(例如CreateNewCustomer())时,会通知引擎它应该加载到MSScript 2文件中:CreateNewCustomer.vbs和base \ CreateNewCustomer.vbs在这种情况下,我们实现了一些让我们在VBScript中使用继承。

此外,对我们的COM类VBScriptEngine的引用也传递给了MSScript控件。 所以在任何VBScript中我们可以称之为VBScriptEngine.ExecuteScript(“CreateNewCustomer”,则params),并再次可以执行其他的VBScript

什么是这个任务的挑战是,我们不希望创建和初始化实例太多的MSScript控件,但MSScript控件无法在当前脚本未完成时执行其他脚本。所以在我们的VBScriptEngine中我们有脚本执行堆栈。如果任何VBScript需要调用另一个VBScript,我们需要创建一个新的MSScript控件并将其放入堆栈。有时我们有需要3个或更多MSScript控件同时嵌套的调用

是的所有这些现在看起来很奇怪,当时.NET中的动态语言或动态程序集可以用较少的努力获得更好的结果。早在2006年

0

,我使用“执行”和“的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