web-dev-qa-db-fra.com

Comment inclure un fichier commun dans VBScript (similaire à C #include)?

VBScript ne semble pas avoir un moyen d'inclure un fichier commun de fonctions.

Existe-t-il un moyen d'y parvenir?

38
paxdiablo

Le framework "Windows Script Host" (si vous voulez l'appeler ainsi), propose un document wrapper XML qui ajoute des fonctionnalités sur les fichiers vbs standard. L'un d'eux est la possibilité d'inclure des fichiers de script externes à la fois les versions VBscript et Jscript. Je n'y suis jamais allé très profondément, mais je pense que cela ferait ce que vous voulez faire. http://msdn.Microsoft.com/en-us/library/15x4407c (VS.85) .aspx

Vous pouvez inclure JavaScript, VBScript ou des modules d'autres langages de script WScript.

Exemple de fichier WSF:

<job id="IncludeExample">
   <script language="JavaScript" src="sprintf.js"/>
   <script language="VBScript" src="logging.vbs"/>
   <script language="VBScript" src="iis-queryScriptMaps.vbs"/>
</job>

Si le fichier ci-dessus est appelé "iis-scriptmaps.wsf", exécutez-le de cette façon avec cscript.exe:

cscript.exe  iis-scriptmaps.wsf
44
Richard B

Vous pouvez créer une fonction (relativement) petite dans chaque fichier dans lequel vous souhaitez inclure d'autres fichiers, comme suit:

sub includeFile (fSpec)
    dim fileSys, file, fileData
    set fileSys = createObject ("Scripting.FileSystemObject")
    set file = fileSys.openTextFile (fSpec)
    fileData = file.readAll ()
    file.close
    executeGlobal fileData
    set file = nothing
    set fileSys = nothing
end sub

puis l'utiliser pour inclure des fichiers spécifiques - ceux-ci sont exécutés comme s'ils étaient en ligne.

includeFile "commonapi.vbi"
includeFile "dbcalls.vbi"

Il ouvre essentiellement le fichier, lit l'intégralité du contenu dans une chaîne, puis exécute cette chaîne. Il n'y a pas de gestion d'erreur sur les appels d'E/S car ce genre de choses est généralement effectué une fois au démarrage du programme, et vous voulez échouer s'il y a un problème à l'inclure.


Notez que la fonction includeFile peut être compressée pour:

Sub includeFile(fSpec)
    With CreateObject("Scripting.FileSystemObject")
       executeGlobal .openTextFile(fSpec).readAll()
    End With
End Sub

Ou même pour (si vous n'êtes pas opposé aux longues lignes):

Sub includeFile(fSpec)
    executeGlobal CreateObject("Scripting.FileSystemObject").openTextFile(fSpec).readAll()
End Sub
54
paxdiablo

Je sais que c'est un vieux fil de discussion mais je poste quand même ma réponse pour que les autres puissent apprendre ce que j'ai appris sur les fichiers VBS et WSF par "essai et erreur":

Donc, pour avoir les mêmes fonctionnalités que dans d'autres langues, vous pouvez créer un fichier WSF et y inclure toutes vos bibliothèques VBS, y compris le programme principal.

Quelque chose comme ça :

<job id="MainProg">
  <script language="VBScript" src="Constants.vbs"/>
  <script language="VBScript" src="FileFunctions.vbs"/>
  <script language="VBScript" src="SendMail.vbs"/>
  <script language="VBScript" src="LoggingFunctions.vbs"/>
  <script language="VBScript" src="MainProgram.vbs"/>   
  <script language="VBScript">
    ' Here we call the main program
    MainProgram()
  </script>
</job>

Dans Constants.vbs Collectez toutes les constantes que vous souhaitez utiliser ultérieurement et dans les autres fichiers VBS définissez vos fonctions. Dans votre fichier programme principal MainProgram.vbs, Créez un sub appelé MainProgram() et écrivez votre programme là-bas. Dans ce sous-programme, vous pouvez utiliser toutes les constantes et fonctions définies dans les autres fichiers VBS.

Par exemple :

sub MainProgram()
  ' Local variables
  Dim strMessage, strSendTo, strSubject
  ' OpenFile is a function from FileFunctions.vbs
  strMessage = OpenFile("C:\Msg\message.html")
  strSendTo = "[email protected]"
  strSubject = "Daily report - " & date
  ' SendMessage is a function from SendMail.vbs
  ' cFrom and cServer are constants from Constants.vbs
  SendMessage(cFrom, strSendTo, strSubject, strMessage, cServer)
  ' Logger is a function from LoggingFunctions.vbs
  Logger("Daily report sent - " & now())
end sub

J'espère que vous avez l'idée et je pourrais aider certaines personnes à écrire de meilleures applications VBS :)

16
Etalon

En s'appuyant sur la réponse acceptée, voici une sous-procédure d'inclusion qui prend un chemin relatif à l'emplacement du script au lieu du répertoire de travail:

Sub include( relativeFilePath ) 
    Set fso = CreateObject("Scripting.FileSystemObject")
    thisFolder = fso.GetParentFolderName( WScript.ScriptFullName ) 
    absFilePath = fso.BuildPath( thisFolder, relativeFilePath )
    executeGlobal fso.openTextFile( absFilePath ).readAll()
End Sub

Notez que vous pouvez également utiliser . et .. des parties de votre chemin pour inclure des fichiers dans les dossiers parents, etc. et peu importe d'où vous lancez le script. Exemple:

include "..\Lib\StringUtilities.vbs"
5
BuvinJ

Ce VBScript est-il utilisé localement ou servi-il de manière classique ASP style?

Si c'est un ASP classique, vous pouvez utiliser SSI pour le faire:

<!-- #include virtual="/PathTo/MyFile.vbs" -->
1
FlySwat

Vous pouvez utiliser la fonction ExecuteGlobal pour exécuter du code VBS arbitraire dans l'espace de noms global. Un exemple peut être trouvé ici: http://www.source-code.biz/snippets/vbscript/5.htm

1
Faraz

IIS 5 et versions ultérieures autorisent également une balise script pour inclure d'autres fichiers à partir d'un fichier ASP. (Votre VBScript est-il un ASP page ou un script Windows?) Voici un exemple:

<script language="VBScript" runat="server" src="include.asp"></script>

Le comportement et les règles sont un peu différents des inclusions côté serveur. Remarque: je n'ai jamais essayé d'utiliser cette syntaxe d'ASP classique.

0
Mike Henry

vous pouvez certainement utiliser la balise de script WSF en cscript:

<script language="VBScript" src="ADOVBS.INC"/>

Si vous utilisez ADOVBS.inc pour un accès ADODB, assurez-vous de supprimer le

<% %>

tags de ADOVBS.INC.

0
LKlein