web-dev-qa-db-fra.com

Exécuter un vbscript à partir d'un autre vbscript

Comment puis-je obtenir un vbscript pour exécuter un autre vbscript?

J'imagine qu'il ne s'agit que de quelques lignes de code mais que je n'ai pas essayé de le faire auparavant, rien n'est passé entre les 2, il suffit d'appeler/d'exécuter l'autre.

Par exemple, le script en cours d'exécution s'appelle TestScript.vbs, l'autre script à appeler/exécuter s'appelle Secondscript.vbs, les deux étant situés dans C:\Temp.

Merci Mark

16
markdigi

Voir si les travaux suivants

Dim objShell
Set objShell = Wscript.CreateObject("WScript.Shell")

objShell.Run "TestScript.vbs" 

' Using Set is mandatory
Set objShell = Nothing
20
Martin

Pour compléter, vous pouvez envoyer 3 arguments comme ceci:

objShell.Run "TestScript.vbs 42 ""an arg containing spaces"" foo" 
8
blairxy

Vous pouvez essayer d'utiliser la méthode Wshshell.Run qui vous donne peu de contrôle sur le processus que vous commencez avec elle. Ou vous pouvez utiliser la méthode WshShell.Exec qui vous donnera le contrôle pour le terminer, obtenir une réponse, transmettre plus de paramètres (autres que les arguments de ligne de commande), obtenir le statut, etc.

Pour utiliser Run (Méthode simple)

Dim ProgramPath, WshShell, ProgramArgs, WaitOnReturn,intWindowStyle
Set WshShell=CreateObject ("WScript.Shell")
ProgramPath="c:\test run script.vbs"
ProgramArgs="/hello /world"
intWindowStyle=1
WaitOnReturn=True
WshShell.Run Chr (34) & ProgramPath & Chr (34) & Space (1) & ProgramArgs,intWindowStyle, WaitOnReturn

ProgramPath est le chemin complet de votre script que vous voulez exécuter. 
ProgramArgs sont les arguments que vous voulez transmettre au script. (REMARQUE: les arguments sont séparés par un espace. Si vous souhaitez utiliser un argument qui contient un espace, vous devez inclure cet argument entre guillemets. [Le moyen sûr de le faire est d'utiliser CHR (34) Exemple ProgramArgs= chr (34) & "/Hello World" & chr (34) ])
IntWindowStyle est le nombre entier déterminant le mode d'affichage de la fenêtre. Plus d'informations à ce sujet et WaitOnReturn peuvent être trouvées ici Méthode WshShell.Run
WaitOnReturn si la valeur est true, le script est suspendu jusqu'à la fin de la commande. Si la valeur est false, le script continue juste après le démarrage de la commande.

REMARQUE: la méthode Run peut renvoyer le code de sortie, mais vous devez définir WaitOnReturn sur True et affecter le 'WshShell.Run' à une variable. (EX: ExitCode=WshShell.Run (Command,intWindowStyle,True))}

Pour utiliser EXEC (méthode avancée)

Dim ProgramPath, WshShell, ProgramArgs, Process, ScriptEngine
Set WshShell=CreateObject ("WScript.Shell")
ProgramPath="c:\test run script.vbs"
ProgramArgs="/hello /world"
ScriptEngine="CScript.exe"
Set Process=WshShell.Exec (ScriptEngine & space (1) & Chr(34) & ProgramPath & Chr (34) & Space (1) & ProgramArgs)
Do While Process.Status=0
    'Currently Waiting on the program to finish execution.
    WScript.Sleep 300
Loop

ProgramPath identique à Run Run DESCRIPTION DE LA RUN
ProgramArgs DITTO 
ScriptEngine Le moteur que vous utiliserez pour exécuter le script. comme la méthode exec nécessite une application win32, vous devez le spécifier. Habituellement, "WScript.exe" ou "CScript.exe". Notez que pour utiliser stdin et stdout (nous verrons ce qu'ils sont un peu plus bas), vous devez choisir "CScript.exe".
Process c'est l'objet qui fait référence au programme que le script va démarrer. Il a plusieurs membres et ils sont: ExitCode, ProcessID, Status, StdErr, StdIn, StdOut, Terminate.

Plus de détails sur les membres de Process Object

  1. ExitCode Il s'agit du code de sortie renvoyé à la fin du processus.
  2. ProcessID Il s'agit de l'ID attribué au processus. Chaque processus a un ID de processus unique.
  3. Status Il s'agit d'un numéro de code indiquant l'état du processus. Il est défini sur '-1' à la fin du processus.
  4. StdErr Ceci est l'objet qui représente le flux d'erreur standard
  5. StdIn Cet objet représente le flux d'entrée standard. Utilisez-le pour écrire des paramètres supplémentaires ou tout ce que vous voulez transmettre au script que vous appelez. (Process.StdIn.WriteLine "Hello Other Worlds")
  6. StdOut Ceci est l'objet qui représente le flux de sortie standard. Il s'agit de EN LECTURE SEULE et vous pouvez donc utiliser Process.StdOut.ReadLine. C'est le flux par lequel le script appelé reçoit toutes les informations envoyées par le stdin du script appelant. Si vous avez utilisé l'exemple de stdin, StdOut.Readline renverra "Hello Other Worlds". S'il n'y a rien à lire, le script se bloque en attendant une sortie. ce qui signifie que le script semblera être pas de réponse
    Remarque: vous pouvez utiliser Read ou ReadAll au lieu de ReadLine si vous le souhaitez. Utilisez Read (X) si vous souhaitez lire une quantité X de caractères. Ou ReadAll si vous souhaitez conserver le reste du flux.
  7. Terminate Appelez cette méthode pour forcer l'arrêt du processus.

Pour plus d'informations sur WshShell.Exec, accédez à Méthode Exec Hôte de script Windows

6
Ronnie Matthews

Vous pouvez également charger le corps du script et l'exécuter dans le même processus:

Set fs = CreateObject("Scripting.FileSystemObject")
Set ts = fs.OpenTextFile("script2.vbs")
body = ts.ReadAll
ts.Close
Execute body
5
Alain Tésio

Essaye ça.

Option Explicit

On error resume next
Dim Shellobj
Set Shellobj = CreateObject("WScript.Shell")

Shellobj.Run "Test.vbs" 

Set Shellobj = Nothing
2
Sebastin Anthony

Si vous ne voulez pas vous fâcher avec des espaces dans les arguments et que vous voulez utiliser des variables, essayez ceci:

objshell.run "cscript ""99 Writelog.vbs"" /r:" &  r & " /f:""" & wscript.scriptname & """ /c:""" & c & ""

r=123
c="Whatever comment you like"
1
redphender

J'ai vu le code ci-dessous fonctionner… .. simple, mais je suppose que non documenté… .. Quelqu'un d'autre a utilisé la commande 'Execute'?

   Dim body, my_script_file
   Set Fso = CreateObject("Scripting.FileSystemObject")


   Set my_script_file = fso.OpenTextFile(FILE)
   body = my_script_file.ReadAll
    my_script_file.Close

    Execute body
1
Andreas

Comme La réponse de Martin n'a pas fonctionné du tout pour moi ("Fichier non trouvé") et la réponse de atesio ne permet pas d'appeler deux scripts qui incluent la répétition de définitions de variables. Voici une autre alternative qui a finalement fonctionné pour moi:

filepath =  Chr(34) & "C:\...\helloworld.vbs" & Chr(34)
Set objshell= CreateObject("WScript.Shell") 
objshell.Run "wscript " & filepath, , True
Set objshell= Nothing

(Windows 8.1)

0
thewaywewalk