Comment faire une pause dans l'exécution d'un fichier batch Windows entre une commande et la suivante ?
Réponses
Trop de publicités?La manière correcte de dormir dans un fichier batch est d'utiliser la commande timeout
introduite dans Windows 2000.
Attendre quelque part entre 29 et 30 secondes :
timeout /t 30
Le délai d'attente sera interrompu si l'utilisateur appuie sur une touche quelconque ; toutefois, la commande accepte également le commutateur facultatif suivant /nobreak
qui ignore effectivement tout ce que l'utilisateur peut appuyer, à l'exception d'une commande explicite de CTRL-C
:
timeout /t 30 /nobreak
De plus, si vous ne voulez pas que la commande imprime son compte à rebours à l'écran, vous pouvez rediriger sa sortie vers le site suivant NUL
:
timeout /t 30 /nobreak > NUL
Puisqu'il s'applique ici, aussi, je vais copier ma réponse d'un autre site .
Si vous voulez utiliser le ping, il y a un meilleur moyen. Vous voudrez envoyer un ping à une adresse qui n'existe pas, ce qui vous permettra de spécifier un délai d'attente avec une précision de l'ordre de la milliseconde. Heureusement, une telle adresse est définie dans une norme (RFC 3330), et il s'agit de 192.0.2.x
. Il ne s'agit pas d'une invention, mais bien d'une adresse dont le seul but est de ne pas exister (ce n'est peut-être pas clair, mais cela s'applique même aux réseaux locaux) :
192.0.2.0/24 - Ce bloc est attribué à "TEST-NET" pour être utilisé dans le cadre de documentation et le code d'exemple. Il est souvent utilisé en conjonction avec avec les noms de domaine exemple.com ou exemple.net dans la documentation des fournisseur et de protocole. Les adresses de ce bloc ne doivent pas apparaître sur l'Internet public. Internet public.
Pour dormir pendant 123 millisecondes, utilisez ping 192.0.2.1 -n 1 -w 123 >nul
Avis de non-responsabilité il ne s'agit pas de la solution "idéale", alors ne vous donnez pas la peine de me taper sur la tête avec ça comme on le fait avec ceux qui recommandent la solution "idéale". ping
...
Dans la mesure du possible, utilisez timeout
c'est sûr. Mais comme indiqué dans les commentaires, ce n'est pas toujours une option (par exemple en mode non interactif). Après cela, je suis d'accord pour dire que le ping
Le "kludge" est peut-être la meilleure option suivante, car elle est très simple. Cela dit, je vous propose une autre option... intégrer un peu de VB script .
La base de cette solution a toutes sortes d'applications au-delà de cela. Souvent, VBS peut faire des choses que le batch ne peut pas faire, ou du moins le faire avec beaucoup plus de facilité. En utilisant la technique illustrée ici, vous pouvez mélanger les deux (pas "de manière transparente", mais "de manière fonctionnelle"...).
Voici une astuce pour créer un script temporaire, l'exécuter, puis le supprimer. Le script fait le sommeil pour vous (pendant 3 secondes dans cet exemple).
echo WScript.Sleep 3000 > %temp%\sleep.vbs & cscript %temp%\sleep.vbs %sleepMs% //B & del %temp%\sleep.vbs
Voici en gros la même chose, écrite un peu différemment :
set sleepMs=3000 & set sleepVbs=%temp%\sleep.vbs & echo WScript.Sleep WScript.Arguments(0) > %sleepVbs% & cscript %sleepVbs% %sleepMs% //B & del %sleepVbs%
Et puis finalement, comme ping
, CScript
a lui-même une option de temps mort ! Ainsi, si vous entrez dans une boucle infinie dans le script, vous pouvez laisser l'interpréteur faire respecter la durée. Notez, c'est une opération "occupée", qui mange le CPU, et donc je ne le recommande pas quand vous pouvez utiliser la fonction WScript.Sleep
mais je la présente comme une option conceptuelle par souci d'exhaustivité :
set sleepSec=3 & set sleepVbs=%temp%\sleep.vbs & echo While True > %sleepVbs% & echo Wend >> %sleepVbs% & cscript %sleepVbs% //B //T:%sleepSec% & del %sleepVbs%