Powerd911 – Numéro #1 au Canada

Suspendre l’exécution d’un script à l’aide d’un délai d’attente

Comparer .Exec et .Run

Le fait qu’il y ait deux façons d’exécuter des programmes à partir d’un script mène à une question évidente: quelle méthode devrais-je utiliser dans mes scripts? La réponse à cette question dépend du script et ce qu’il doit accomplir.

Un script peut utiliser soit la méthode Run ou la méthode Exec pour exécuter un programme d’une manière similaire à l’aide de la boîte de dialogue Exécuter du menu Démarrer. Quelle que soit la méthode utilisée, le programme démarre, et fonctionne dans un nouveau processus.

Toutefois, lorsque vous utilisez la méthode Run, votre script n’aura pas accès aux entrées/sorties (stdin/stdout) et au flux standard d’erreur (stderr) générés par le programme en cours d’exécution. Un script ne peut pas utiliser la méthode Run pour lancer un programme et récupérer sa sortie.

Par exemple, supposons que vous voulez exécuter l’application Ping.exe et ensuite examiner la sortie pour voir si l’ordinateur pourrait être contacté avec succès. Cela devrait être fait en utilisant la commande Exec. Sinon vous aurez besoin de faire un ping de l’ordinateur, enregistrer les résultats de la commande Ping dans un fichier texte, ouvrir le fichier texte, lire les résultats, puis analyser les résultats afin de déterminer le succès ou l’échec de la commande.

Le script suivant utilise la méthode Run pour appeler l’application Ping.exe, rediriger la sortie vers un fichier temporaire. Pour ce faire le script ouvre et lit le fichier texte, vérifie si la commande a réussi (en déterminant si l’une des lignes de sortie Commence par le mot « Réponse« ), puis ferme et supprime le fichier temporaire:

Set objFSO = Wscript.CreateObject("Scripting.FileSystemObject")
Set objShell = Wscript.CreateObject("Wscript.Shell")
objName = objFSO.GetTempName
objTempFile = objName
objShell.Run "cmd /c ping -n 3 -w 1000 157.59.0.1 >" & objTempFile, 0, True
Set objTextFile = objFSO.OpenTextFile(objTempFile, 1)
Do While objTextFile.AtEndOfStream <> True
strText = objTextFile.ReadLine
If Instr(strText, "Réponse") > 0 Then
Wscript.Echo "Réponse reçu."
Exit Do
End If
Loop
objTextFile.Close
objFSO.DeleteFile(objTempFile)

Bien que cette approche fonctionne, elle est un peu compliquée.

Si vous devez accéder à la sortie de ligne de commande, vous devriez utiliser la méthode Exec à la place. Le script suivant analyse également la sortie générée par l’application Ping.exe. Cependant, il le fait en utilisant la méthode Exec et en lisant directement le texte de sortie. Comme vous pouvez le constater il n’y a pas besoin de créer, d’ouvrir, de lire et de supprimer un fichier temporaire, et le script à seulement 9 lignes, par rapport aux 15 lignes nécessaires pour effectuer cette même tâche en utilisant la méthode Run:

Set objShell = WScript.CreateObject("WScript.Shell")
Set objExecObject = objShell.Exec("cmd /c ping -n 3 -w 1000 157.59.0.1")
Do While Not objExecObject.StdOut.AtEndOfStream
strText = objExecObject.StdOut.ReadLine()
If Instr(strText, "Réponse") > 0 Then
Wscript.Echo "Réponse reçu"
Exit Do
End If
Loop

À bien des égards, cela rend la méthode Exec un meilleur choix que la méthode Run. Cependant, la méthode Run est utile dans un certain nombre de situations si vous désirez :

  • exécuter l’application dans un type de fenêtre spécifique, comme une fenêtre réduite. Exec propose aucun contrôle sur le style de la fenêtre; Run offre plusieurs options;
  • exécuter un script sur des ordinateurs qui ne disposent pas de WSH 5.6 installé. Exec est uniquement prise en charge sur WSH 5.6 ;
  • attendre que votre script reprenne que lorsque l’application a terminé d’exécuter. Cela peut être fait avec Exec, mais nécessite moins de codage avec Run.

Dans un programme en Visual Basic on peut appeler la méthode Exec de la manière suivante et vérifier l’état de l’objet retourné WshScriptExec, qui permet de fournir un état sur l’éxécution de l’application

Set ErrExec = ObjShell.Exec ("calc")
Output ErrExec.Status

Laisser un commentaire