2009-09-17 48 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

相关问题