2009-09-17 7 views
6

Estoy escribiendo un programa de JScript que se ejecuta en cscript.exe. ¿Es posible ejecutar un comando de línea commnad desde el script? Realmente haría el trabajo más fácil, ya que puedo ejecutar ciertos comandos en lugar de escribir más código en jscript para hacer lo mismo.¿Hay alguna manera de ejecutar un comando de línea de comando desde JScript (no javascript) en Windows Scripting Host (WSH) cscript.exe?


Por ejemplo: Con el fin de esperar a una pulsación de tecla durante 10 segundos, que podría utilizar de inmediato el comando de tiempo de espera

timeout /t 10 

La implementación de este en JScript significa más trabajo. por cierto, estoy en Vista y WSH v5.7

¿Alguna idea? gracias!

Respuesta

8

Puede ejecutar comandos de DOS usando el WshShell.Run método:

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.Run("timeout /t 10", 1 /* SW_SHOWNORMAL */, true /* bWaitOnReturn */); 


Si usted necesita específicamente para detener la ejecución del script hasta que se pulsa una tecla o un tiempo de espera transcurrido, que podría lograr esto usando el método WshShell.Popup (un cuadro de diálogo con una opción de tiempo de espera):

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.Popup("Click OK to continue.", 10); 

Sin embargo, este método muestra un cuadro de mensaje cuando se ejecuta también en cscript.

Otro enfoque posible se describe en este artículo: How Can I Pause a Script and Then Resume It When a User Presses a Key on the Keyboard? En resumen, puede usar la propiedad WScript.StdIn para leer directamente desde el flujo de entrada y de esta manera esperar la entrada. Sin embargo, la lectura de la secuencia de entrada no admite el tiempo de espera y solo regresa al presionar la tecla ENTER (no cualquier tecla). De todos modos, aquí está un ejemplo, por si acaso:

WScript.Echo("Press the ENTER key to continue..."); 

while (! WScript.StdIn.AtEndOfLine) { 
    WScript.StdIn.Read(1); 
} 
+0

que funcionó! thanx – detj

1

gracias por el PPL de ayuda, este fue mi primer post y stackoverflow es increíble! Además, descubrí otra forma de hacer esto, utilizando el método oShell.SendKeys().
He aquí cómo:

var oShell = WScript.CreateObject("WScript.Shell"); 
oShell.SendKeys("cls{enter}timeout /t 10{enter}"); 

De esta manera se puede ejecutar el comando casi cada dos sin genere un nuevo proceso o ventana

EDIT: A pesar de que parece resolver el problema, este código no es muy fiable. Ver los comentarios a continuación

+0

Su cadena SendKeys es incorrecta - debe ser "cls {enter} timeout/t 10 {enter}" (sin más). – Helen

+0

Además, su variante es muy poco confiable. En primer lugar, 'SendKeys' envía pulsaciones de teclas a la ventana activa, por lo que la entrada puede enviarse a otra ventana que se haya activado accidentalmente. Además, si hay comandos que siguen a 'SendKeys', no se ejecutarán después de' SendKeys'. Intenta insertar los comandos 'WScript.Echo' antes y después de' SendKeys' y elimina 'cls' de la cadena de entrada, y verás que la salida del script está en mal estado y el comando' timeout' se ejecuta por último. – Helen

+0

Sí ... ¡este código es realmente complicado!Comencé a experimentar problemas una vez que lo ejecuté con el resto del código y es cierto que con SendKeys, las declaraciones no se ejecutan necesariamente a medida que aparecen. Se pone aún peor si tiene un WScript.StdIn.Readline() con SendKeys(), ya que no esperaría a que el usuario lo ingresara porque ya está recibiendo información de SendKeys y ¡rompe las cosas de la manera más desagradable! Lección aprendida: tenga mucho cuidado con SendKeys, puede ser descuidado gran idea helen! – detj

Cuestiones relacionadas