Temps réel de la sortie de la console de WScript.Shell Exec
J'ai passé la plupart de la journée à la recherche d'une solution à cela, je commence à penser que sa peut-être pas possible pour mes besoins
Ma configuration de base est d'exécuter un script vbscript (.vbs) a appelé à partir d'un code excel vba. Le code vba est de continuer et de laisser le vbscript en cours d'exécution, mais de le surveiller de temps en temps à l'aide de Exec.Status
Dans le vbscript je suis en utilisant WScript.StdOut.WriteLine "whatever"
de suivi/debug c'est déjà un progrès, mais en l'état actuel je ne peux que lire c'est sortie après le code excel vba est fini ce qu'il doit faire.
Ce que je veux, c'est de voir un vrai temps de sortie de la console à partir du vbscript
Voici le code vba...
Dim WSH As IWshRuntimeLibrary.WshShell 'Windows Script Host Object Model
Dim Exec As WshExec
Set WSH = CreateObject("WScript.Shell")
Set Exec = WSH.Exec("%COMSPEC% /C CSCRIPT.EXE //nologo " _
& VbsFileDir _
& " " & Arg1 _
& " " & Arg2 _
& " " & Arg3 _
& " " & Arg4)
J'ai été en mesure d'obtenir en temps réel de la sortie par la conversion de WSH.Exec
à WSH.Run
, mais je n'ai besoin de l'accès à Exec.Status
, ce qui n'est pas disponible sous WSH.Run
Mise à JOUR - 2015-02-06
De préciser plus loin... à l'Aide de l'exemple " ...B. vbs code fourni par @Ekkehard.De Horner réponse... suivantes excel-vba code d'affichage en temps réel de la sortie de la console...
WSH.Run("cscript C:353522-B.vbs")
...mais la suivante NE rien afficher à la console
WSH.Exec("cscript C:353522-B.vbs")
Je ne peux pas utiliser le .Run()
parce que je utiliser le .Status
drapeau de .Exec()
Aussi je ne peux pas il suffit de déplacer le code vbscript dans le code VBA parce que le VBA passe pour effectuer d'autres tâches en parallèle avec le vbscript.
P. s. Si n'importe qui peut soumettre une réponse expliquant pourquoi il ne peut pas être fait, alors je marque comme acceptée.
OriginalL'auteur Skytunnel | 2015-02-05
Vous devez vous connecter pour publier un commentaire.
Utilisation .La sortie standard Stdout.ReadLine() jusqu'à ce que le processus est terminé et que .La sortie standard Stdout.ReadAll() pour siphonner le reste de la production - comme dans
28353522-A. vbs
28353522-B. vbs
de sortie:
BTW - Comment avez-vous une sortie en temps réel avec .Run()?
non, l'Un est un faux pour votre code VBA.
J'ai donc besoin de reproduire le code ré-écrit comme code VBA? Le problème c'est que mon code VBA a d'autres travaux à faire, je ne peux pas l'avoir assis en regardant le B. vbs. J'ai essayé d'expliquer sur la question.
OriginalL'auteur Ekkehard.Horner
Pourquoi êtes-vous à court de deux fichiers? Il n'est pas nécessaire.
VBA, cours de base complet, peut écrire à sa propre console.
Donc de mettre votre script en VBA (vous pouvez couper et coller VBS en VBA et il ne fonctionnera que si vous le mettez sous/end sub autour d'elle). Pour avoir le VBS exécuter en VBA mettre un timer qui déclenche.
Voici un module de classe pour VBA pour créer/lire/écrire des consoles.
OriginalL'auteur user4532213
J'ai trouvé une réponse à ma propre question. Mais ce n'est pas une solution (que je vais expliquer ci-dessous), je vais donc pas le marquage comme correct, mais peut-être quelqu'un peut corriger les problèmes avec la solution? (si oui, postez une réponse et je vais le marquer comme correct)
Tout d'abord, +1 pour @Ekkehard.De Horner réponse pour inspirer de cette solution.
Créer le fichier 'B. vbs" représentant principal de mon vbscript.
Créer le fichier 'A. vbs' agir comme un intermédiaire entre les principaux vbscript et mon code Excel VBA
Maintenant le code excel VBA...
De sorte que le VBA Excel appelle le "A. vbs' toujours à l'aide de
WSH.Exec()
, alors qui va appeler le "B. vbs' l'aide deWSH.Run()
, qui ouvre une deuxième fenêtre de la console qui affiche en temps réel la sortieAvantages
Exec.Status
avec précisionInconvénients (raisons pour lesquelles je ne suis pas de marquage comme correcte)
Exec.Terminate()
ne en finir avec les "A. vbs' (première fenêtre de la console), le "B. vbs" restera l'exécution deExec.StdOut.
ne peut pas lire la sortie de "B. vbs'OriginalL'auteur Skytunnel