2009-09-17 3 views
6

Ich schreibe ein JScript-Programm, das in Cscript.exe ausgeführt wird. Ist es möglich, einen commnad-Zeilenbefehl innerhalb des Skripts auszuführen? Es würde die Arbeit wirklich erleichtern, da ich bestimmte Befehle ausführen kann, anstatt mehr Code in jscript zu schreiben, um dasselbe zu tun.Gibt es eine Möglichkeit, einen Befehlszeilenbefehl von JScript (nicht Javascript) in Windows Scripting Host (WSH) cscript.exe auszuführen?


Zum Beispiel: Um 10 Sekunden lang auf einen Tastendruck zu warten, ich den Timeout-Befehl sofort konnte

timeout /t 10 

Implementierung dieser in jscript bedeutet Arbeit mehr verwenden. BTW, ich bin auf Vista und WSH v5.7

irgendwelche Ideen? Danke!

Antwort

8

Sie können DOS-Befehle ausführen, mit der WshShell.Run Methode:

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


Wenn Sie speziell auf die Skriptausführung zu unterbrechen müssen, bis eine Taste gedrückt wird oder ein Timeout abgelaufen ist, Sie erreichen könnte dies unter Verwendung der WshShell.Popup Methode (ein Dialogfeld mit einer Zeitüberschreitungsoption):

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

Diese Methode zeigt jedoch auch ein Meldungsfeld an, wenn sie unter cscript ausgeführt wird.

Ein anderer möglicher Ansatz wird in diesem Artikel beschrieben: How Can I Pause a Script and Then Resume It When a User Presses a Key on the Keyboard? Kurz gesagt, können Sie die Eigenschaft WScript.StdIn verwenden, um direkt aus dem Eingabestream zu lesen und auf diese Weise auf Eingaben zu warten. Das Lesen aus dem Eingabestream unterstützt jedoch keine Zeitüberschreitung und kehrt nur bei Drücken der Taste ENTER zurück (keine Taste). Wie auch immer, hier ist ein Beispiel, für alle Fälle:

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

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

das funktioniert! thanx – detj

1

Danke für die Hilfe ppl, das war mein erster Beitrag und Stackoverflow ist genial! Auch habe ich einen anderen Weg gefunden, diese Sache zu tun, mit der oShell.SendKeys() Methode.
Hier ist, wie:

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

So kann man fast jedes dos einen neuen Prozess oder Fenster Befehl ausführen können

EDIT ohne Laichen: Auch wenn es um das Problem zu lösen scheint, dieser Code nicht sehr zuverlässig ist. Siehe die Kommentare unter

+0

Ihre SendKeys Zeichenfolge ist falsch - es sollte "Cls {Enter} Timeout/t 10 {Enter}" (ohne Plus) sein. – Helen

+0

Auch Ihre Variante ist sehr unzuverlässig. Zunächst sendet 'SendKeys' Tastenanschläge an das aktive Fenster, sodass die Eingabe möglicherweise an ein anderes Fenster gesendet wird, das versehentlich aktiviert wurde. Wenn Befehle 'SendKeys' folgen, werden sie nicht nach' SendKeys' ausgeführt. Versuchen Sie, die 'WScript.Echo'-Befehle vor und nach' SendKeys' einzufügen und 'cls' aus der Eingabezeichenfolge zu entfernen - und Sie werden sehen, dass die Skriptausgabe durcheinander ist und der' timeout'-Befehl zuletzt ausgeführt wird. – Helen

+0

Ja ... dieser Code ist wirklich chaotisch!Ich fing an, Probleme zu erfahren, sobald ich es mit dem Rest des Codes ausführte, und es stimmt, dass mit SendKeys, Anweisungen nicht notwendigerweise ausgeführt werden, wie sie erscheinen. Es wird noch schlimmer, wenn Sie eine WScript.StdIn.Readline() mit SendKeys() haben, da es nicht auf die Eingabe des Benutzers warten würde, da es bereits Eingaben von SendKeys erhält und die Dinge auf die unangenehme Art und Weise auflöst! Lektion gelernt: Seien Sie sehr vorsichtig mit SendKeys, kann es schlampig sein großen Einblick helen! – detj

Verwandte Themen