2012-10-01 22 views
7

Deseo obtener el resultado de un comando simple desde la línea de comando (cmd.exe) usando un script de Windows (.vbs). ¿Cómo se hace esto? No he podido encontrar un buen ejemplo o explicación simple. Puede usar el comando "fecha" o "hora" para dar un ejemplo. Tales como:vbs cómo obtener el resultado de un comando de línea de comando

enter image description here

P.S. Puedo escribir el código del script que abre cmd.exe y envía el comando.

Gracias!

+0

más 1 porque el diagrama es increíble: o –

Respuesta

10

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.

+0

Bien, eso funciona, gracias, pero creo que no esperaba una respuesta tan simple. Voy a explicar lo que estoy tratando de hacer. Quiero usar la programación basada en línea de comandos de Atmel para programar algunos chips. Es realmente fácil de usar y funciona bien. Puedo abrir el shell de comandos y enviar los comandos usando SendKeys, pero cuando intento incluir el comando usando Exec, solo aparece la ventana pero no inserta el comando. ¿Qué está haciendo realmente el "/ c"? ¿Hay alguna otra forma de obtener el resultado de un comando? Necesito una forma de saber si la programación fue exitosa o no. – user1387865

+0

¡Gracias por la ayuda! Lo aprecio. Simplemente no he tenido éxito todavía. Por alguna razón, cuando envío Set p = CreateObject("WScript.Shell").Exec("%COMSPEC% /c atprogram"), solo abre el terminal sin ingresar el comando "atprogram".He intentado varias cosas, pero simplemente no ejecutará el comando. Siento que estoy forzado a usar SendKeys pero luego no puedo ver la salida a menos que deje la ventana del terminal abierta. – user1387865

Cuestiones relacionadas