En caso de duda, lea el documentation. Es posible que desee algo como esto:
Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c date /t")
Do While p.Status = 0
WScript.Sleep 100
Loop
WScript.Echo p.StdOut.ReadAll
Editar: Al utilizar Exec()
se pasa a través de la entrada de descriptor .StdIn
, no a través de SendKeys()
(que es una forma bastante poco fiable de paso de entrada de todos modos).
%COMSPEC%
es una variable de entorno de sistema con la ruta completa a cmd.exe
y la opción /c
hace cmd.exe
salida después del comando (date /t
en el ejemplo) se termina.
Si el comando indica éxito/falla con un código de salida, puede verificar la propiedad ExitCode
después de que el comando finalizó.
If p.Status <> 0 Then WScript.Echo p.ExitCode
Edit2: En lugar de utilizar atprogram
forma interactiva, se puede construir líneas de comando que realizan tareas particulares sin interacción del usuario? Con líneas de comando no interactivas algo como esto podría funcionar:
prompt = "C:\>"
atprogram_cmdline_1 = "atprogram.exe ..."
atprogram_cmdline_2 = "atprogram.exe ..."
'...
Function ReadOutput(p)
text = ""
Do Until Right(text, Len(prompt)) = prompt
text = text & p.StdOut.Read(1)
Loop
ReadOutput = text
End Function
Set cmd = CreateObject("WScript.Shell").Exec("%COMSPEC% /k")
ReadOutput cmd ' skip over first prompt
cmd.StdIn.WriteLine(atprogram_cmdline_1)
WScript.Echo ReadOutput(cmd)
cmd.StdIn.WriteLine(atprogram_cmdline_2)
WScript.Echo ReadOutput(cmd)
'...
cmd.Terminate ' exit CMD.EXE
%COMSPEC% /k
genera un símbolo del sistema sin ejecutar un comando. El /k
evita que se cierre. Como no se cierra automáticamente, no puede usar el bucle While p.Status = 0
aquí. Si un comando necesita algo de tiempo para finalizar, necesita WScript.Sleep
una cantidad de segundos.
A través de cmd.StdIn.WriteLine
puede ejecutar líneas de comando en la instancia CMD
. La función ReadOutput()
lee la salida de StdOut
hasta que aparezca el siguiente mensaje. Debe buscar el aviso, porque las operaciones de lectura son bloqueantes, por lo que no puede decir simplemente "lea todo lo que se haya impreso todavía".
Después de terminar, salga de CMD.EXE
a través de cmd.Terminate
.
más 1 porque el diagrama es increíble: o –