2009-11-13 24 views
38

Come impostare il ritardo in vbscript?Come impostare il ritardo in vbscript

WScript.Sleep(100) non funziona su Windows XP, Vista.

+1

* "' 'WScript.Sleep (100)' non funziona su Windows XP, Vista "* Sì, lo fa (appena testato in XP). Aspetta 100ms (un decimo di secondo). Se si desidera 100 * secondi *, utilizzare 100 * 1000, poiché il valore è in millisecondi. (E siccome questo è VBScript, non hai bisogno dei paren.) In realtà non lo infrangono, ma non è * giusto * ...) –

risposta

16

se è VBScript, dovrebbe essere

WScript.Sleep 100 

Se è javascript

WScript.Sleep(100); 

Tempo in millisecondi. Wscript.Sleep 1000 risulta in un sonno di 1 secondo.

+0

@ badbod99 è come dire: finché non sei catturato, rubando funziona così come l'acquisto - "someSub (param)" passerà una * copia * di param a someSub. –

39

Lavora a questa estremità (XP).

Creare un nuovo file, chiamarlo test.vbs. Mettilo dentro.

WScript.Sleep 1000 
MsgBox "TEST" 

Eseguirlo, notare il ritardo prima che venga visualizzata la finestra di messaggio.

Nota: il numero è in millisecondi, quindi 1000 è 1 secondo.

+4

Rimuovere il) e sostituire (con spazio per rendere il codice VBScript valido –

+1

Come un incantesimo in VistaSP2 –

3

tempo della funzione di sleep è espresso in millisecondi (ms)

se si vuole 3 minuti, questo è il modo per farlo:

WScript.Sleep(1000 * 60 * 3) 
+3

Un'altra violazione della regola: No() quando si chiama un Sub. –

+1

@ Ekkehard.Horner Tuttavia, è _is_ VBScript valido. Passa esplicitamente il valore 'ByVal'. Non userei mai parentesi del genere, scriverei' Call WScript.Sleep (...) '. – Toothbrush

4

Ecco un'altra alternativa:

Sub subSleep(strSeconds) ' subSleep(2) 
    Dim objShell 
    Dim strCmd 
    set objShell = CreateObject("wscript.Shell") 
    'objShell.Run cmdline,1,False 

    strCmd = "%COMSPEC% /c ping -n " & strSeconds & " 127.0.0.1>nul"  
    objShell.Run strCmd,0,1 
End Sub 
27

Se stai cercando di simulare un ritardo del sonno in VBScript, ma WScript non è disponibile (ad esempio: lo script è chiamato dallo strumento BGInfo di Microsoft), quindi prova il seguente approccio.

L'esempio qui di seguito vi ritardare fino a 10 secondi dal momento in cui l'istruzione viene elaborata:

Dim dteWait 
dteWait = DateAdd("s", 10, Now()) 
Do Until (Now() > dteWait) 
Loop 
+2

nb anche questo funziona bene per vbscript nel classico –

+9

può funzionare .. ma sono preoccupato per l'utilizzo della CPU di tale soluzione (è un ciclo lungo). Forse nello script senza WScript disponibile, è possibile chiamarlo con CreateObject, come indicato in questa risposta: http://stackoverflow.com/a/4037208/460362 – Pisu

+0

Non va bene nemmeno per IE8. Non lo consiglio –

2

Ecco la mia soluzione. Ha funzionato con script, che è stato eseguito da un programma di terze parti senza WScript dichiarato e nessuna importazione consentita.

Function MySleep(milliseconds) 
    set WScriptShell = CreateObject("WScript.Shell") 
    WScriptShell.Run "Sleep -m " & milliseconds, 0, true 
end Function 

Aggiornamento
Sembra che Microsoft ha rimosso Sleep.exe da Win 8, quindi questo non funziona nella vittoria 8 a meno che non si mette Sleep.exe nella cartella definita nel percorso%%.

2

Questo è un aggiornamento della soluzione fornita da @ user235218 che consente di specificare il numero di millisecondi richiesto.

Nota: l'opzione -n ​​è il numero di tentativi e -w è il timeout in millisecondi per il ping. Ho scelto l'indirizzo 127.255.255.254 perché è nel range di loopback e ms windows non risponde ad esso.

Inoltre, dubito che questo fornirà una precisione millisecondo, ma su un'altra nota l'ho provato in un'applicazione utilizzando il controllo di script ms e mentre la funzione integrata di sleep ha bloccato l'interfaccia, questo metodo no.

Se qualcuno può fornire una spiegazione del motivo per cui questo metodo non ha bloccato l'interfaccia, è possibile rendere questa risposta più completa. Entrambe funzionano come funzioni nel thread utente.

Const WshHide = 0 
Const WAIT_ON_RETURN = True 

Sub Sleep(ByVal ms) 

    Dim shell 'As WScript.Shell 

    If Not IsNumeric(ms) Then _ 
     Exit Sub 

    Set shell = CreateObject("WScript.Shell") 

    Call shell.Run("%COMSPEC% /c ping -n 1 -w " & ms & " 127.255.255.254 > nul", WshHide, WAIT_ON_RETURN) 

End Sub
3

un uso migliore del timer:

Sub wait (sec) 
    dim temp 
    temp=timer 
    do while timer-temp<sec 
    loop 
end Sub 
+0

questa è una buona soluzione, molto semplice, ma quando viene eseguita all'interno di un HTA genera un avviso di script non responsivo, chiedendo se si desidera interrompere l'esecuzione dello script perché potrebbe bloccare il computer. Puoi dire di no, ma interrompe comunque il normale flusso del programma. – freginold

6

Un sacco di risposte qui per scontato che si sta eseguendo il tuo VBScript in Windows Scripting Host (in genere wscript.exe o cscript.exe). Se ricevi errori come 'La variabile non è definita: "WScript"' quindi probabilmente no.

L'oggetto WScript è disponibile solo se si utilizza l'host di script di Windows, se si esegue in un altro host di script, ad esempio Internet Explorer (e si potrebbe essere senza rendersene conto se si è in qualcosa come un HTA) non è automaticamente disponibile.

Microsoft, Hey, Scripting Guy! Blog ha un articolo che va in proprio questo argomento How Can I Temporarily Pause a Script in an HTA? in cui utilizzare un VBScript setTimeout per creare un timer per simulare un sonno senza bisogno di usare CPU loop hogging, ecc

Il codice utilizzato è questo:

<script language = "VBScript"> 

    Dim dtmStartTime 

    Sub Test 
     dtmStartTime = Now 
     idTimer = window.setTimeout("PausedSection", 5000, "VBScript") 
    End Sub 

    Sub PausedSection 
     Msgbox dtmStartTime & vbCrLf & Now 
     window.clearTimeout(idTimer) 
    End Sub 

</script> 

<body> 
    <input id=runbutton type="button" value="Run Button" onClick="Test"> 
</body> 

Vedere lo linked blog post per la spiegazione completa, ma in sostanza quando si fa clic sul pulsante si crea un timer che emette 5000 millisecondi da ora e quando viene eseguito viene eseguita la sottorete VBScript denominata "PausedSection" che azzera il timer ed esegue qualunque sia il codice che desideri.

9

La seguente riga farà dormire lo script per 5 minuti.

WScript.Sleep 5*60*1000 

Si noti che il valore passato alla chiamata a riposo è espresso in milli secondi.