Time 在x分钟后终止vbscript

Time 在x分钟后终止vbscript,time,vbscript,Time,Vbscript,我正在使用vbscript编写脚本,我希望它在x分钟后自行终止 我在想一些事情,比如抓取脚本开始的时间,然后将整个过程保持在一个循环中,直到开始时间后的x分钟,但我需要它在后台不断检查,而不是仅仅等待循环完成 我想要一条消息或一些东西,通知用户他们花了太长时间,我可以自己做 有没有办法在背景中记录时间,或者确定时间是一个漫长的过程 cscript Usage: CScript scriptname.extension [option...] [arguments...] Options: /

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

我在想一些事情,比如抓取脚本开始的时间,然后将整个过程保持在一个循环中,直到开始时间后的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
更新:

为了帮助那些对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)。啊,您正在使用类析构函数来终止外部程序。聪明。我喜欢。