我正在使用vbscript编写脚本,我希望它在x分钟后自行终止。
我正在考虑抓住脚本启动时的时间,然后将整个事情保持在一个循环中,直到时间是开始时间后的x分钟,但我需要它继续检查后台,而不是等到循环完成。
我想要一条消息或某些东西通知用户他们花了太长时间,我可以自己做。
有没有办法在后台跟踪时间,还是有点确定它的过程?
答案 0 :(得分:6)
根据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 :(得分:2)
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
<强>更新强>
为了帮助那些通过@ PanayotKarabakalov的烟雾屏幕看到cscript.exe的使用信息(这怎么可能出错?)的简单(并且到点)引用的人:
索赔:
使用// T开关不保证实时准确性
表示所有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 " & _
然后尝试一下。
答案 2 :(得分:2)
我很欣赏这里的所有答案,但它们比我想要的更复杂。
我很惊讶地发现有一种方法可以将其内置到WScript
中。
WScript.Timeout = x_seconds
答案 3 :(得分:2)
这是另一个简短而优雅的解决方案,它允许终止脚本和通过WScript.Timeout
异步运行的外部可执行文件
Option Explicit
Dim oSmallWrapperWshExec
WScript.Timeout = 7
Set oSmallWrapperWshExec = New cSmallWrapperWshExec
' Some code here
MsgBox "Waiting timeout" & vbCrLf & vbCrLf & "You may close notepad manually and/or press OK to finish script immediately"
Class cSmallWrapperWshExec
Private oWshShell
Private oWshExec
Private Sub Class_Initialize()
Set oWshShell = CreateObject("WSCript.Shell")
With oWshShell
Set oWshExec = .Exec("notepad")
.PopUp "Launched executable", 2, , 64
End With
End Sub
Private Sub Class_Terminate()
On Error Resume Next
With oWshShell
If oWshExec.Status <> 0 Then
.PopUp "Executable has been already terminated", 2, , 64
Else
oWshExec.Terminate
.PopUp "Terminated executable", 2, , 64
End If
End With
End Sub
End Class