Comment suspendre temporairement l'exécution d'un fichier batch Windows entre une commande et la suivante?
Comment suspendre temporairement l'exécution d'un fichier batch Windows entre une commande et la suivante?
Réponses:
La bonne façon de dormir dans un fichier de commandes consiste à utiliser la timeout
commande introduite dans Windows 2000.
Pour attendre quelque part entre 29 et 30 secondes :
timeout /t 30
Le délai d'attente serait interrompu si l'utilisateur appuyait sur une touche quelconque. Cependant, la commande accepte également le commutateur optionnel /nobreak
, qui ignore en réalité tout ce sur quoi l'utilisateur peut appuyer, à l'exception d'un explicite CTRL-C
:
timeout /t 30 /nobreak
De plus, si vous ne souhaitez pas que la commande affiche son compte à rebours à l'écran, vous pouvez rediriger sa sortie vers NUL
:
timeout /t 30 /nobreak > NUL
Comme cela s'applique ici aussi, je vais copier ma réponse depuis un autre site .
Si vous voulez utiliser ping, il existe un meilleur moyen. Vous voudrez envoyer une requête ping à une adresse inexistante afin de pouvoir spécifier un délai d'expiration avec une précision à la milliseconde. Heureusement, une telle adresse est définie dans une norme (RFC 3330), et elle l’est 192.0.2.x
. Ce n'est pas inventé, c'est vraiment une adresse dont le seul but est de ne pas exister (ça peut ne pas être clair, mais ça s'applique même dans les réseaux locaux):
192.0.2.0/24 - Ce bloc est affecté à "TEST-NET" pour être utilisé dans la documentation et dans les exemples de code. Il est souvent utilisé 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 l'Internet public.
Pour dormir pendant 123 millisecondes, utilisez ping 192.0.2.1 -n 1 -w 123 >nul
Ping
est tout simplement le mauvais outil pour le travail.
Vous pouvez également insérer un ping à localhost. Cela prendra 4 secondes pour terminer (par défaut). Certains le considèrent comme un béguin, mais cela fonctionne quand même très bien.
La commande:
ping 127.0.0.1
ping
votre système d'exploitation est fourni ou non . Si vous êtes assez inquiet pour '95 '98 ou ME, vous devriez être tout aussi inquiet pour 6.22 qui n'a pas non ping
plus
Déni de responsabilité : ce n'est pas la solution "idéale", alors ne vous donnez pas la peine de me faire taper à la tête avec ça, comme c'est le cas pour ceux qui recommandent ping
...
Si possible, utilisez timeout
à coup 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, car il est très simple. Cela dit, je propose une autre option ... intégrer un script VB .
La base de cette solution a toutes sortes d’applications. Souvent, VBS peut faire des choses que le lot 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 manière transparente", mais "de manière fonctionnelle" ...).
Voici un one-line pour créer un script temporaire, l'exécuter, puis le supprimer. Le script veille 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 fondamentalement 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
, a CScript
lui - même une option de délai d'attente! Ainsi, si vous entrez une boucle infinie dans le script, vous pouvez laisser l'interprète appliquer la durée. Notez que ceci est une opération "occupée", qui consomme le processeur, et par conséquent, je ne le recommande pas lorsque vous pouvez utiliser la WScript.Sleep
procédure, mais je le 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%