3

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

我在想一些事情,比如抓住脚本开始的时间,然后让整个事情循环起来,直到时间是开始时间后的 x 分钟,但我需要它继续在后台检查,而不是等到一个循环完成。

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

有什么方法可以在后台跟踪时间,或者确定它会是一个漫长的过程吗?

4

4 回答 4

7

按照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."

您仍然会重新启动脚本,但在这种情况下,您的脚本会杀死子进程,而不是脚本解释器。

于 2013-02-23T21:01:52.993 回答
4

这是另一个简短而优雅的解决方案,它允许终止脚本和异步运行的外部可执行文件,通过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
于 2018-07-16T13:30:08.640 回答
2

我很欣赏这里的所有答案,但它们比我想要的要复杂得多。

我很惊讶地发现有一种方法可以在WScript.

WScript.Timeout = x_seconds
于 2013-03-25T03:26:34.527 回答
1
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或否//T),第二个/重新启动的实例永远不会超时,并且总是会运行到最后。

如果您仍有疑问,请将 P. 脚本中的调用更改为

 CreateObject("WScript.Shell").Run "WScript //T:4 " & _

并尝试一下。

于 2013-02-22T19:19:11.610 回答