2009-06-30 3 views
0

Pour tous les VBS Gurus là-bas ...Des idées sur la structure VBS pour permettre un code commun

J'ai écrit une suite de scripts VB (pour automatiser des installations, si vous devez savoir) qui utilisent un ensemble de fonctions communes pour quelque chose comme la journalisation, le démarrage/l'arrêt des services, etc.

J'ai créé un design qui utilise un script qui contient les fonctions communes dans une classe. Il déclare et instancie également une variable du type de classe.
J'ai aussi un script 'loader' qui vérifie si l'objet de classe existe et si ce n'est pas le cas, exécute le script de classe.

Chaque script que j'écris inclut un appel au chargeur, puis je peux appeler des méthodes de la classe instanciée.

C'est une solution assez sympa (à mon humble avis) mais je me demandais si quelqu'un avait d'autres/meilleurs moyens d'atteindre la même chose?

- Pete

Note: Ceci ne concerne que les scripts VB dans les fichiers .vbs

+0

sons propres, sons complexes aussi bien. Une chose que vous pouvez déjà gérer est de s'assurer que tous les chemins sont relatifs afin que vous puissiez déplacer le chargeur et ce qui ne l'est pas. – JoshBerke

+0

Acclamations Josh. J'ai essayé cela mais quand un script inclut un autre script (en utilisant .OpenTextFile), Wscript.ScriptFullName dans le script inclus renvoie le chemin du script appelant, pas celui appelé, donc il est impossible d'appeler quelque chose relativement, sauf par rapport au script appelant, sauf si vous changez le répertoire courant, ce que je ne veux pas faire cela peut affecter d'autres programmes. Cela semble compliqué, mais est en fait assez simple dans la pratique et permet de construire une bibliothèque utile – FrinkTheBrave

Répondre

0

Nous avons obtenu la même chose dans VB5. Dans notre application, les scripts VB ont été utilisés pour personnaliser les règles métier et même l'interface utilisateur. Il y avait une structure de fichier appropriée, par exemple les classes de base étaient dans base \ folder. Lorsque l'application VB était en cours d'exécution, nous utilisions le contrôle MSScript pour exécuter des scripts. L'étape d'initialisation consistait à charger les noms des fichiers VBS et à créer en mémoire une arborescence d'association. Puis quand VB besoin d'appeler certains scripts, par exemple CreateNewCustomer(), un moteur a été informé qu'il devrait charger dans les fichiers MSScript 2: CreateNewCustomer.vbs et base \ CreateNewCustomer.vbs

Dans ce cas, nous avons mis en place quelque chose qui nous permet utiliser l'héritage dans VBScripts.

De plus, une référence à notre classe COM, VBScriptEngine, a également été transmise au contrôle MSScript. Ainsi, dans une VBScript nous avons pu appeler VBScriptEngine.ExecuteScript (« CreateNewCustomer », params) et il peut encore exécuter une autre VBScript

Quel était le défi dans cette tâche est que nous ne voulons pas créer et initialiser trop de cas du contrôle MSScript, mais le contrôle MSScript ne peut pas exécuter un autre script lorsque le script en cours n'est pas terminé. Donc, dans notre VBScriptEngine, nous avons une pile d'exécution de script. Si n'importe quel VBScript doit appeler un autre VBScript, nous devons créer un nouveau contrôle MSScript et le placer dans la pile. Parfois, nous avons des appels imbriqués qui nécessitent 3 contrôles MSScript ou plus simultanément

Oui, tout cela semble très étrange de nos jours quand des langages dynamiques ou des assemblages dynamiques dans .NET pourraient être utilisés pour obtenir de meilleurs résultats avec moins d'efforts.

+0

Marqué cela comme la réponse car il était très intéressant :-) – FrinkTheBrave

0

En 2006, je suis venu avec la solution suivante en utilisant "Exécuter" et "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 

D'autres exemples sont situés ici: http://github.com/randollr/LVA

Questions connexes