2009-09-17 87 views
6

我正在寫一個在cscript.exe中運行的JScript程序。是否可以在腳本中運行commnad命令行。這會讓工作變得簡單,因爲我可以運行某些命令,而不是在jscript中編寫更多代碼來執行相同的操作。有沒有辦法在Windows腳本宿主(WSH)cscript.exe中從JScript(而不是JavaScript)運行命令行命令?


例如: 爲了等待一個按鍵10秒,我可以馬上使用的超時命令

timeout /t 10 

實現這在JScript意味着更多的工作。 順便說一句,我在Vista和WSH v5.7

任何想法?感謝名單!

回答

8

可以執行使用WshShell.Run方法DOS命令:

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


如果你特別需要,直到按下某個鍵或超時經過暫停腳本執行,你可以完成這使用WshShell.Popup方法(帶有超時選項的對話框):

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

但是,此方法也會在cscript下運行時顯示消息框。

本文描述了另一種可能的方法:How Can I Pause a Script and Then Resume It When a User Presses a Key on the Keyboard?簡而言之,您可以使用WScript.StdIn屬性直接從輸入流中讀取,並以此方式等待輸入。但是,從輸入流讀取不支持超時,並且僅在按下按鍵(而不是任何按鍵)時才返回。無論如何,這是一個例子,以防萬一:

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

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

工作! thanx – detj 2009-09-18 07:10:11

1

thanx的幫助脂肪酶,這是我的第一篇文章和stackoverflow是真棒! 此外,我想出了另一種方法來使用oShell.SendKeys()方法做這件事。
方法如下:

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

這樣你就可以在不產生一個新的進程或窗口

EDIT運行幾乎所有的DOS命令:雖然它似乎解決了問題,這個代碼不是很可靠。看到下面的評論

+0

您的SendKeys字符串不正確 - 應該是「cls {enter} timeout/t 10 {enter}」(不帶加號)。 – Helen 2009-09-18 11:03:23

+0

另外,你的變體是非常不可靠的。首先,SendKeys將鍵擊發送到活動窗口,因此輸入可能被髮送到意外激活的另一個窗口。另外,如果有'SendKeys'後面的命令,它們將不會在'SendKeys'後被執行。嘗試在SendKeys之前和之後插入'WScript.Echo'命令並從輸入字符串中刪除'cls' - 並且您將看到腳本輸出已經混亂,最後執行'timeout'命令。 – Helen 2009-09-18 11:03:58

+0

是的..這個代碼真的很混亂!一旦我將其與代碼的其餘部分一起運行時,我開始遇到問題,並且使用SendKeys時,語句不一定會按照它們的顯示執行。 如果你有一個帶有SendKeys()的WScript.StdIn.Readline(),它會變得更糟,因爲它不會等待用戶輸入因爲它已經從SendKeys獲得輸入,並且它確實分解了討厭的方式! 獲得的經驗:對SendKeys非常小心,它可以是馬虎 偉大的洞察海倫! – detj 2009-09-18 17:02:55

相關問題