Time 在x分钟后终止vbscript
我正在使用vbscript编写脚本,我希望它在x分钟后自行终止 我在想一些事情,比如抓取脚本开始的时间,然后将整个过程保持在一个循环中,直到开始时间后的x分钟,但我需要它在后台不断检查,而不是仅仅等待循环完成 我想要一条消息或一些东西,通知用户他们花了太长时间,我可以自己做 有没有办法在背景中记录时间,或者确定时间是一个漫长的过程Time 在x分钟后终止vbscript,time,vbscript,Time,Vbscript,我正在使用vbscript编写脚本,我希望它在x分钟后自行终止 我在想一些事情,比如抓取脚本开始的时间,然后将整个过程保持在一个循环中,直到开始时间后的x分钟,但我需要它在后台不断检查,而不是仅仅等待循环完成 我想要一条消息或一些东西,通知用户他们花了太长时间,我可以自己做 有没有办法在背景中记录时间,或者确定时间是一个漫长的过程 cscript Usage: CScript scriptname.extension [option...] [arguments...] Options: /
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
更新:
为了帮助那些对cscript.exe的使用信息(这怎么可能是错误的?)的简单引用投反对票的人通过@PanayotKarabakalov的烟雾屏看到光明:
索赔:
使用//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
或no//T
),第二个/重新启动的实例将永远不会超时,并且将始终运行到最后
如果您仍然有疑问,请将p.脚本中的调用更改为
CreateObject("WScript.Shell").Run "WScript //T:4 " & _
然后尝试一下。按照建议使用
//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."
Const Timeout=4'分钟
timedOut=False
如果WScript.Arguments.Named.Exists(“重新启动”),则
'您的代码在这里
其他的
limit=DateAdd(“n”,超时,现在)
cmd=“wscript.exe”“&wscript.ScriptFullName&”“/relaunch”
Set p=CreateObject(“WScript.Shell”).Exec(cmd)
p.状态=0时执行此操作
如果现在<限制那么
WScript.Sleep 100
其他的
在错误恢复下一步“忽略无效窗口句柄”错误
p、 终止
错误转到0
timedOut=True
如果结束
环
如果结束
如果timedOut,则WScript.Echo“脚本超时”
您仍然会重新启动脚本,但在这种情况下,是您的脚本杀死了子进程,而不是脚本解释器。我很欣赏这里的所有答案,但它们比我想要的要复杂得多
我非常惊讶地发现,在WScript
中内置了一种方法来实现这一点
WScript.Timeout = x_seconds
下面是另一个简短而优雅的解决方案,它允许通过WScript.Timeout来终止异步运行的脚本和外部可执行文件
选项显式
Dim oSmallWrapperWshExec
WScript.Timeout=7
设置oSmallWrapperWshExec=New cSmallWrapperWshExec
“这里有一些代码
MsgBox“等待超时”&vbCrLf&vbCrLf&“您可以手动关闭记事本和/或按“确定”立即完成脚本”
类cSmallWrapperWshExec
私人奥斯谢尔酒店
私家车
私有子类_Initialize()
设置oWshShell=CreateObject(“WSCript.Shell”)
用奥斯谢尔
设置oWshExec=.Exec(“记事本”)
.弹出“已启动的可执行文件”,2,64
以
端接头
私有子类_Terminate()
出错时继续下一步
用奥斯谢尔
如果状态为0,则
.PopUp“可执行文件已终止”,2,64
其他的
终止
.弹出“已终止的可执行文件”,2,64
如果结束
以
端接头
末级
我是否只需要脚本并用这些参数重新启动它本身?我需要脚本本身的超时。@MattMiller-重新启动或使用“主”脚本来计算超时并启动“从”脚本。因此,基本上没有办法在同一个脚本中执行此操作?@MattMiller更正。VBScript不支持并行处理。@Ekkehard.Horner-感谢您的评论,因为您帮助我发现了我的错误!干杯+1用于考虑规范“a消息”的解决方案。。。这会通知用户他们花了太长的时间(并且不会让你感到恶心)。好主意,有一件事让我很烦恼,我在p行得到了“无效的窗口句柄”。Terminate
。如果cmd
使用“cscript.exe”或“%comspec%/c wscript”,则工作正常。@PanayotKarabakalov我注意到有时会发生这种情况。不过,我不确定到底是什么原因造成的。由于子进程无论如何都会终止,因此最好忽略它并将通知移到循环之外。我相应地更新了我的示例代码。我认为Exec
expect-visible-window,但是错误跟踪是一个很好的修复(+1)。啊,您正在使用类析构函数来终止外部程序。聪明。我喜欢。