2013-02-22 66 views
0

我正在使用vbscript编写脚本,我希望它在x分钟后自行终止。x分钟后终止vbscript

我在想着抓住脚本开始的时间,然后把整个事情放在一个循环中,直到时间是开始时间之后的几分钟,但我需要它继续检查背景,并且不只是等到一个循环完成。

我想要一条消息或其他东西,通知用户他们花了太长时间,我可以自己做。

有没有什么方法可以跟踪后台时间,还是将其作为一个抽出过程来确定它?

那么,我想出了如何做到这一点。

WScript.Timeout = x'以秒为单位的时间。

回答

1
cscript 
Usage: CScript scriptname.extension [option...] [arguments...] 

Options: 
//B   Batch mode: Suppresses script errors and prompts from displaying 
//D   Enable Active Debugging 
//E:engine Use engine for executing script 
//H:CScript Changes the default script host to CScript.exe 
//H:WScript Changes the default script host to WScript.exe (default) 
//I   Interactive mode (default, opposite of //B) 
//Job:xxxx Execute a WSF job 
//Logo  Display logo (default) 
//Nologo Prevent logo display: No banner will be shown at execution time 
//S   Save current command line options for this user 
**//T:nn  Time out in seconds: Maximum time a script is permitted to run** 
//X   Execute script in debugger 
//U   Use Unicode for redirected I/O from the console 

更新:

为了帮助谁downvote一个普通的人(和对点)的Cscript.exe的使用信息的引用(?这怎么可能是错的),看看光线透过@ PanayotKarabakalov的烟幕:

根据权利要求:在使用//Ť

开关不能保证实时精度

所有5 echo命令执行,即使它们之间的睡眠时间 为1.5第二和// T设定为4

证据:

的脚本通过重新启动:

CreateObject("WScript.Shell").Run "WScript " & _ 
    Chr(34) & WScript.ScriptFullName & _ 
    Chr(34) & " /T:4", 0, False 

这确实包含主机专用//T(而不是在特定的脚本/T)开关。

的(柜)的说法:

无论方式启动脚本的第一个实例(//T或无//T),第二/重新推出实例将永远不会有超时,将始终运行血战到底。

如果您还有疑问,请更改P.的脚本调用到

CreateObject("WScript.Shell").Run "WScript //T:4 " & _ 

,并尝试一下。

+0

我只是有脚本,并重新启动自己的那些参数? 我需要从脚本本身的超时。 – 2013-02-22 19:22:08

+0

@MattMiller - 重新启动或使用“主”脚本来计算超时并启动“奴隶”。 – 2013-02-22 19:26:59

+0

那么,基本上没有办法在同一个脚本中做到这一点? – 2013-02-22 21:46:16

4

按照Ekkehard.Horner建议的//T:xx重新启动脚本可能是您的最佳选择。另外,略有不同,方法可能是这样的:

Const Timeout = 4 'minutes 

timedOut = False 

If WScript.Arguments.Named.Exists("relaunch") Then 
    'your code here 
Else 
    limit = DateAdd("n", Timeout, Now) 
    cmd = "wscript.exe """ & WScript.ScriptFullName & """ /relaunch" 
    Set p = CreateObject("WScript.Shell").Exec(cmd) 
    Do While p.Status = 0 
    If Now < limit Then 
     WScript.Sleep 100 
    Else 
     On Error Resume Next 'to ignore "invalid window handle" errors 
     p.Terminate 
     On Error Goto 0 
     timedOut = True 
    End If 
    Loop 
End If 

If timedOut Then WScript.Echo "Script timed out." 

你还是会被重新启动脚本,但在这种情况下,它是你的脚本杀子过程,而不是脚本解释器。

+0

+1对于一个解决方案,考虑到规范的'消息...通知用户他们花了太长时间'(并且不会让你生病)。 – 2013-02-23 21:20:15

+0

不错的主意,只是有一件事打扰我,我在'p.Terminate'行得到“无效的窗口句柄”。如果'cmd'与“cscript.exe”或“%comspec%/ c wscript”一起使用,那么工作正常。 – 2013-02-24 00:54:12

+0

@PanayotKarabakalov我注意到有时会发生这种情况。不知道究竟是什么导致它。由于子进程无论如何都会终止,因此最好忽略它并将通知移出循环。我相应地更新了我的示例代码。 – 2013-02-24 10:59:37

2

我很欣赏这里所有的答案,但它们比我想要的更复杂。

我很惊讶地发现有一种方法可以将它嵌入到WScript中。

WScript.Timeout = x_seconds