我正在使用vbscript編寫腳本,我希望它在x分鐘後自行終止。x分鐘後終止vbscript
我在想着抓住腳本開始的時間,然後把整個事情放在一個循環中,直到時間是開始時間之後的幾分鐘,但我需要它繼續檢查背景,並且不只是等到一個循環完成。
我想要一條消息或其他東西,通知用戶他們花了太長時間,我可以自己做。
有沒有什麼方法可以跟蹤後臺時間,還是將其作爲一個抽出過程來確定它?
那麼,我想出瞭如何做到這一點。
WScript.Timeout = x'以秒爲單位的時間。
我正在使用vbscript編寫腳本,我希望它在x分鐘後自行終止。x分鐘後終止vbscript
我在想着抓住腳本開始的時間,然後把整個事情放在一個循環中,直到時間是開始時間之後的幾分鐘,但我需要它繼續檢查背景,並且不只是等到一個循環完成。
我想要一條消息或其他東西,通知用戶他們花了太長時間,我可以自己做。
有沒有什麼方法可以跟蹤後臺時間,還是將其作爲一個抽出過程來確定它?
那麼,我想出瞭如何做到這一點。
WScript.Timeout = 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
更新:
爲了幫助誰downvote一個普通的人(和對點)的Cscript.exe的使用信息的引用(?這怎麼可能是錯的),看看光線透過@ PanayotKarabakalov的煙幕:
根據權利要求:在使用//Ť
開關不能保證實時精度
所有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 " & _
,並嘗試一下。
按照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對於一個解決方案,考慮到規範的'消息...通知用戶他們花了太長時間'(並且不會讓你生病)。 – 2013-02-23 21:20:15
不錯的主意,只是有一件事打擾我,我在'p.Terminate'行得到「無效的窗口句柄」。如果'cmd'與「cscript.exe」或「%comspec%/ c wscript」一起使用,那麼工作正常。 – 2013-02-24 00:54:12
@PanayotKarabakalov我注意到有時會發生這種情況。不知道究竟是什麼導致它。由於子進程無論如何都會終止,因此最好忽略它並將通知移出循環。我相應地更新了我的示例代碼。 – 2013-02-24 10:59:37
我很欣賞這裏所有的答案,但它們比我想要的更復雜。
我很驚訝地發現有一種方法可以將它嵌入到WScript中。
WScript.Timeout = x_seconds
我只是有腳本,並重新啓動自己的那些參數? 我需要從腳本本身的超時。 – 2013-02-22 19:22:08
@MattMiller - 重新啓動或使用「主」腳本來計算超時並啓動「奴隸」。 – 2013-02-22 19:26:59
那麼,基本上沒有辦法在同一個腳本中做到這一點? – 2013-02-22 21:46:16