x分钟后终止vbscript

时间:2013-02-22 19:10:02

标签: time vbscript

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

我正在考虑抓住脚本启动时的时间,然后将整个事情保持在一个循环中,直到时间是开始时间后的x分钟,但我需要它继续检查后台,而不是等到循环完成。

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

有没有办法在后台跟踪时间,还是有点确定它的过程?

4 个答案:

答案 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