web-dev-qa-db-fra.com

Comment définir le délai dans vbscript

Comment définir le délai dans vbscript?

WScript.Sleep(100) ne fonctionne pas sous Windows XP, Vista.

49
Mark

Travaillez cette fin (XP).

Créez un nouveau fichier, appelez-le test.vbs. Mettez ceci dedans.

WScript.Sleep 1000
MsgBox "TEST"

Exécutez-le, notez le délai avant que la boîte de message ne s'affiche.

Notez que le nombre est en millisecondes, donc 1000 correspond à 1 seconde.

52
badbod99

Si vous essayez de simuler un délai de veille dans VBScript mais que WScript n'est pas disponible (votre script est par exemple appelé à partir de l'outil BGInfo de Microsoft), essayez l'approche suivante.

L'exemple ci-dessous retardera jusqu'à 10 secondes à partir du traitement de l'instruction:

Dim dteWait
dteWait = DateAdd("s", 10, Now())
Do Until (Now() > dteWait)
Loop
30
Original Paulie D

si c'est VBScript, il devrait être

WScript.Sleep 100

Si c'est du JavaScript

WScript.Sleep(100);

Temps en millisecondes. WScript.Sleep 1000 entraîne un sommeil d'une seconde.

20
Jeeva Subburaj

La ligne suivante fera dormir votre script pendant 5 minutes.

WScript.Sleep 5*60*1000

Notez que la valeur transmise à l'appel en veille est exprimée en millisecondes.

10
Raja Anbazhagan

Beaucoup de réponses ici supposent que vous exécutez votre VBScript dans l'hôte de script Windows (généralement wscript.exe ou cscript.exe). Si vous obtenez des erreurs telles que ', la variable n'est pas définie: "WScript" ', alors vous ne l'êtes probablement pas.

L'objet WScript est disponible uniquement si vous utilisez Windows Hosting Script, si vous utilisez un autre script Host, tel qu'Internet Explorer (et vous risquez de ne pas vous en rendre compte si vous êtes dans un environnement HTA). non disponible automatiquement.

Hé, scripteur de Microsoft! Le blog contient un article qui traite uniquement de ce sujet Comment puis-je suspendre temporairement un script dans un HTA? dans lequel ils utilisent un script VBScript setTimeout pour créer un minuteur permettant de simuler une veille sans utiliser des boucles monopolisant le processeur, etc.

Le code utilisé est le suivant:

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

Voir le article de blog lié pour l'explication complète, mais lorsque vous cliquez sur le bouton, un temporisateur déclenche 5 000 millisecondes à partir de maintenant et, lorsqu'il se déclenche, exécute la sous-routine VBScript appelée "PausedSection" qui efface la minuterie et lance le code que vous voulez.

9
GAThrawn

Voici une autre alternative:

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 
7
Marc B. Hankin

mieux utiliser timer:

Sub wait (sec)
    dim temp
    temp=timer
    do while timer-temp<sec
    loop
end Sub
4
Artem Korostelev

La fonction de temps de sommeil est exprimée en millisecondes (ms)

si vous voulez 3 minutes, c'est la façon de le faire:

WScript.Sleep(1000 * 60 * 3)
4
Nadir SOUALEM

Voici une mise à jour de la solution fournie par @ user235218 qui vous permet de spécifier le nombre de millisecondes requis.

Remarque: l'option -n correspond au nombre de tentatives et le -w correspond au délai d'expiration en millisecondes du ping. J’ai choisi l’adresse 127.255.255.254 parce qu’elle se situe dans la plage du bouclage et que ms windows ne répond pas.

Je doute également que cela fournisse une précision de l'ordre de la milliseconde, mais sur une autre note, je l'ai essayé dans une application utilisant le contrôle de script ms et, bien que la fonction de veille intégrée ait verrouillé l'interface, cette méthode ne l'a pas été.

Si quelqu'un peut expliquer pourquoi cette méthode n'a pas verrouillé l'interface, nous pouvons compléter cette réponse. Les deux fonctions de veille ont été exécutées dans le thread utilisateur.

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
Robert

Voici ma solution. Utilisation d'un script exécuté par un programme tiers sans déclaration WScript ni importation autorisée.

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

Mise à jour
On dirait que Microsoft a supprimé Sleep.exe de Windows 8, donc cela ne fonctionne pas avec Windows 8, sauf si vous placez Sleep.exe dans le dossier défini dans% path%.

3
Atomosk