我正在使用vbscript编写脚本,我希望它在x分钟后自行终止。x分钟后终止vbscript
我在想着抓住脚本开始的时间,然后把整个事情放在一个循环中,直到时间是开始时间之后的几分钟,但我需要它继续检查背景,并且不只是等到一个循环完成。
我想要一条消息或其他东西,通知用户他们花了太长时间,我可以自己做。
有没有什么方法可以跟踪后台时间,还是将其作为一个抽出过程来确定它?
那么,我想出了如何做到这一点。
WScript.Timeout = x'以秒为单位的时间。
我正在使用vbscript编写脚本,我希望它在x分钟后自行终止。x分钟后终止vbscript
我在想着抓住脚本开始的时间,然后把整个事情放在一个循环中,直到时间是开始时间之后的几分钟,但我需要它继续检查背景,并且不只是等到一个循环完成。
我想要一条消息或其他东西,通知用户他们花了太长时间,我可以自己做。
有没有什么方法可以跟踪后台时间,还是将其作为一个抽出过程来确定它?
那么,我想出了如何做到这一点。
WScript.Timeout = x'以秒为单位的时间。
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 " & _
,并尝试一下。
按照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."
你还是会被重新启动脚本,但在这种情况下,它是你的脚本杀子过程,而不是脚本解释器。
+1对于一个解决方案,考虑到规范的'消息...通知用户他们花了太长时间'(并且不会让你生病)。 – 2013-02-23 21:20:15
不错的主意,只是有一件事打扰我,我在'p.Terminate'行得到“无效的窗口句柄”。如果'cmd'与“cscript.exe”或“%comspec%/ c wscript”一起使用,那么工作正常。 – 2013-02-24 00:54:12
@PanayotKarabakalov我注意到有时会发生这种情况。不知道究竟是什么导致它。由于子进程无论如何都会终止,因此最好忽略它并将通知移出循环。我相应地更新了我的示例代码。 – 2013-02-24 10:59:37
我很欣赏这里所有的答案,但它们比我想要的更复杂。
我很惊讶地发现有一种方法可以将它嵌入到WScript中。
WScript.Timeout = x_seconds
我只是有脚本,并重新启动自己的那些参数? 我需要从脚本本身的超时。 – 2013-02-22 19:22:08
@MattMiller - 重新启动或使用“主”脚本来计算超时并启动“奴隶”。 – 2013-02-22 19:26:59
那么,基本上没有办法在同一个脚本中做到这一点? – 2013-02-22 21:46:16