web-dev-qa-db-fra.com

Comment dormir dans un fichier batch?

Comment suspendre un instant l'exécution dans un fichier batch Windows entre une commande et la suivante?

141
Massimo

La bonne façon de dormir dans un fichier de commandes consiste à utiliser la commande timeout , introduite dans Windows 2000.

Attendre quelque part entre 29 et 30 secondes :

timeout /t 30

Le délai d'attente serait interrompu si l'utilisateur appuie sur une touche; cependant, la commande accepte également le commutateur facultatif /nobreak, qui ignore efficacement tout ce que l'utilisateur peut appuyer, à l'exception d'un CTRL-C:

timeout /t 30 /nobreak

De plus, si vous ne voulez pas que la commande affiche son compte à rebours à l'écran, vous pouvez rediriger sa sortie vers NUL:

timeout /t 30 /nobreak > NUL
209
Massimo

Puisqu'il s'applique ici aussi, je vais copier ma réponse d'un autre site .

Si vous souhaitez utiliser le ping, il existe un meilleur moyen. Vous souhaiterez envoyer une requête ping à une adresse qui n'existe pas, vous pouvez donc spécifier un délai d'expiration avec une précision en millisecondes. Heureusement, une telle adresse est définie dans une norme (RFC 3330), et c'est 192.0.2.x. Ce n'est pas inventé, c'est vraiment une adresse dans le seul but de ne pas exister (elle n'est peut-être pas claire, mais elle s'applique même dans les réseaux locaux):

192.0.2.0/24 - Ce bloc est affecté en tant que "TEST-NET" pour une utilisation dans la documentation et l'exemple de code. Il est souvent utilisé conjointement avec les noms de domaine example.com ou example.net dans la documentation du fournisseur et du protocole. Les adresses de ce bloc ne doivent pas apparaître sur Internet public.

Pour dormir pendant 123 millisecondes, utilisez ping 192.0.2.1 -n 1 -w 123 >nul

16
mafu

Vous pouvez également insérer un ping sur localhost. Cela prendra 4 secondes (par défaut). Il est considéré comme un kludge par certains, mais fonctionne tout de même très bien.

La commande:
ping 127.0.0.1

8
acolyte

Clause de non-responsabilité: ce n'est pas la solution "idéale", alors ne vous embêtez pas à me battre dessus avec la même chose que pour ceux qui recommandent ping...

Lorsque cela est possible, utilisez timeout pour 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 conviens que le ping "kludge" est peut-être la meilleure option suivante, car il est très simple. Cela dit, j'offre une autre option ... intégrer certains 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, 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 façon transparente", mais "fonctionnellement" ...).

Voici une ligne, 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 essentiellement 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 enfin, comme ping, CScript lui-même a une option de timeout! Donc, si vous entrez une boucle infinie dans le script, vous pouvez laisser l'interprète appliquer la durée. Remarque, il s'agit d'une opération "occupée", qui consomme le processeur, et donc je ne le recommande pas lorsque vous pouvez utiliser le WScript.Sleep procédure, 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%
3
BuvinJ