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

アップデート:

@PanayotKarabakalov の煙幕を通して光を見るために、cscript.exe の使用法メッセージの単純な (そして要点までの) 引用 (どうして間違っているのでしょうか?) に反対票を投じる人々を助けるために:

請求:

//T スイッチを使用すると、リアルタイムの精度が保証されません

それらの間のスリープ時間が 1.5 秒で //T が 4 に設定されている場合でも、5 つの Echo コマンドがすべて実行されたことを確認します。

確たる証拠:

スクリプトは次の方法で再起動されます。

CreateObject("WScript.Shell").Run "WScript " & _
    Chr(34) & WScript.ScriptFullName & _
    Chr(34) & " /T:4", 0, False

これには、ホスト固有の(スクリプト固有の ではなく) スイッチは含まれません。//T/T

(カウンター) 引数:

スクリプトの最初のインスタンスを開始する方法 (//Tまたは no //T) に関係なく、2 番目のインスタンスまたは再起動されたインスタンスにはタイムアウトが発生せず、常に最後の最後まで実行されます。

それでも疑問がある場合は、P. のスクリプトの呼び出しを次のように変更します。

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

そして試してみてください。

于 2013-02-22T19:19:11.610 に答える