Lors de l'écriture d'un fichier batch pour automatiser quelque chose sur une boîte Windows, j'ai dû suspendre son exécution pendant plusieurs secondes (généralement dans une boucle de test / attente, en attendant le démarrage d'un processus). À l'époque, la meilleure solution que j'ai pu trouver utilise le ping (je ne plaisante pas) pour obtenir l'effet souhaité. J'en ai trouvé une meilleure description ici , qui décrit un appelable "wait.bat", implémenté comme suit:
@ping 127.0.0.1 -n 2 -w 1000 > nul
@ping 127.0.0.1 -n %1% -w 1000> nul
Vous pouvez ensuite inclure les appels à wait.bat dans votre propre fichier de commandes, en passant le nombre de secondes pour dormir.
Apparemment, le Kit de ressources Windows 2003 fournit une commande de veille de type Unix (enfin!). En attendant, pour ceux d'entre nous qui utilisent encore Windows XP, Windows 2000 ou (malheureusement) Windows NT , y a-t-il un meilleur moyen?
J'ai modifié le sleep.py
script dans la réponse acceptée , afin qu'il prenne par défaut une seconde si aucun argument n'est passé sur la ligne de commande:
import time, sys
time.sleep(float(sys.argv[1]) if len(sys.argv) > 1 else 1)
la source
ping
commande ou télécharger le kit de ressources Windows qui comprend unesleep
commande. Plus de détails ici: Fichier batch SLEEP CommandRéponses:
METTRE À JOUR
La
timeout
commande, disponible à partir de Windows Vista et au-delà, doit être la commande utilisée, comme décrit dans une autre réponse à cette question. Ce qui suit est une vieille réponse.Ancienne réponse
Si Python est installé, ou si cela ne vous dérange pas de l'installer (il a aussi d'autres utilisations :), créez simplement le script sleep.py suivant et ajoutez-le quelque part dans votre PATH:
Cela permettra des pauses de moins d'une seconde (par exemple, 1,5 s, 0,1, etc.), si vous en avez besoin. Si vous souhaitez l'appeler comme
sleep
plutôt quesleep.py
, vous pouvez ajouter l'.PY
extension à votre variable d'environnement PATHEXT. Sous Windows XP, vous pouvez le modifier dans:Poste de travail → Propriétés (menu) → Avancé (onglet) → Variables d'environnement (bouton) → Variables système (cadre)
la source
La
timeout
commande est disponible à partir de Windows Vista:Remarque: cela ne fonctionne pas avec la redirection d'entrée - exemple trivial:
la source
timeout
, ajouté par @Cristian Ciupitu, est partiellement faux - Windows XP n'a pas cette commande.Utiliser la
ping
méthode décrite est la façon dont je le fais lorsque je ne peux pas (ou ne veux pas) ajouter plus d'exécutables ou installer tout autre logiciel.Vous devriez envoyer un ping à quelque chose qui n'est pas là, et utiliser l'
-w
indicateur pour qu'il échoue après ce laps de temps, sans envoyer un ping à quelque chose qui est là (comme localhost) à l'-n
heure. Cela vous permet de gérer le temps en moins d'une seconde, et je pense que c'est un peu plus précis.par exemple
(tester que 1.1.1.1 n'est pas pris)
la source
PING: transmit failed. General failure.
1.1.1.1
est pris par CloudFlare, donc cela n'attendra pas 15s mais environ quelques ms.SLEEP.exe
est inclus dans la plupart des kits de ressources, par exemple le kit de ressources Windows Server 2003 qui peut également être installé sur Windows XP.la source
Je ne suis pas d'accord avec les réponses que j'ai trouvées ici.
J'utilise la méthode suivante entièrement basée sur les capacités de Windows XP pour retarder un fichier batch:
DELAY.BAT:
Vous pouvez également insérer le jour dans le calcul afin que la méthode fonctionne également lorsque l'intervalle de retard dépasse minuit.
la source
TIME
commande.%TIME%
utilisez une virgule pour séparer les centisecondes, au lieu d'un point! Il suffit d'ajouter une virgule dansDELIMS=:.,"
...J'ai rencontré un problème similaire, mais je viens de créer une application console C ++ très courte pour faire la même chose. Exécutez simplement MySleep.exe 1000 - peut-être plus facile que de télécharger / installer tout le kit de ressources.
la source
Chez Server Fault, une question similaire a été posée et la solution était:
la source
CHOICE
versions que je connais, si quelqu'un appuie sur un bouton en attendant, ce que font parfois les gens impatients, alors le choix enregistrera une entrée, émettra un bip système pour une mauvaise entrée et arrêtera le compte à rebours, ce qui signifie qu'il se bloquera là, à moins qu'ils ne poussent N ou Y. Et s'ils poussent simplement l'un de ces deux, alors le choix s'arrête là au lieu d'attendre 5. De plus, ce choix utilise une syntaxe Vista vraiment étrange. Toutes les commandes de choix normales utiliseraient à la placeCHOICE /T:Y,5 > NUL
pour cela. Il n'y a pas de/D
drapeau dans les anciennes versions./C:YN
ou simplement/C:Y
, cela ne fonctionnera pas quand quelqu'un aura, disons, une commande de choix suédoise qui fera probablement un [J, N] par défaut. Donc, c'est embourbé dans toutes sortes de problèmes.Vous pouvez utiliser la couche WSH Windows cscript et ce fichier JavaScript wait.js :
la source
En fonction de vos besoins de compatibilité, utilisez
ping
:par exemple pour attendre 5 secondes, utilisez
ou sur Windows 7 ou version ultérieure
timeout
:la source
-w
est en millisecondes,-n
est juste le nombre de requêtes ping et le temps par défaut entre les requêtes ping est d'une seconde.Vous pouvez utiliser le ping:
Il attendra 10 secondes.
La raison pour laquelle vous devez utiliser 11 est que le premier ping s'éteint immédiatement, pas après une seconde. Le nombre doit toujours être un de plus que le nombre de secondes que vous souhaitez attendre.
Gardez à l'esprit que le but du
-w
n'est pas d'attendre une seconde. C'est pour vous assurer que vous n'attendez pas plus d'une seconde en cas de problèmes de réseau.ping
envoie seul un paquet ICMP par seconde. Ce n'est probablement pas nécessaire pour localhost, mais les vieilles habitudes sont mortes.la source
-w
le délai d'expiration (bien que j'admette que certains peuvent en déduire qu'en raison de mon manque de clarté), il est en fait utilisé pour limiter le temps de cycle là où il y a des problèmes de réseau qui feraient en sorte que chaque cycle prenne plus que son alloué seconde. J'ai ajouté un paragraphe à la fin pour clarifier cela.Il existe une meilleure façon de dormir en utilisant le ping. Vous souhaiterez envoyer un ping à une adresse qui n'existe pas, afin de pouvoir spécifier un délai d'expiration avec une précision de la milliseconde. Heureusement, une telle adresse est définie dans une norme (RFC 3330), et c'est le cas
192.0.2.x
. Ce n'est pas inventé, c'est vraiment une adresse dans le seul but de ne pas exister (cela peut ne pas être clair, mais cela s'applique même dans les réseaux locaux):Pour dormir pendant 123 millisecondes, utilisez
ping 192.0.2.1 -n 1 -w 123 >nul
la source
-n
paramètre.ping 192.0.2.1
sur ce PC Windows et vous verrez que la pile TCP / IP de Windows répond aux demandes d'écho. Combien de personnes savent que 192.0.2.0/24 ne doit pas être utilisé pour une adresse IPv4 statique?127.255.255.255
raison du fait qu'il s'agit d'une adresse de bouclage de diffusion dans Windows qui est déjà attribuée par défaut (vous pouvez le confirmer en exécutantroute print
dans cmd et en parcourant la table de routage IPv4 qu'il imprime).Si vous avez PowerShell sur votre système, vous pouvez simplement exécuter cette commande:
Edit: à partir de ma réponse sur un sujet similaire , les gens ont soulevé un problème où le temps que Powershell prend pour démarrer est significatif par rapport au temps que vous essayez d'attendre. Si la précision du temps d'attente est importante (c'est-à-dire qu'un délai supplémentaire ou deux secondes n'est pas acceptable), vous pouvez utiliser cette approche:
Cela prend le temps où la commande windows a été émise et le script PowerShell se met en veille jusqu'à 5 secondes après cette heure. Donc, tant que PowerShell prend moins de temps pour démarrer que votre durée de sommeil, cette approche fonctionnera (c'est environ 600 ms sur ma machine).
la source
Par exemple, pour que le script effectue une attente non ininterrompue de 2 secondes:
Ce qui signifie que le script attendra 2 secondes avant de continuer.
Par défaut, une pression sur une touche interrompra le délai d'expiration, utilisez donc le
/nobreak
commutateur si vous ne voulez pas que l'utilisateur puisse interrompre (annuler) l'attente. En outre, le délai d'expiration fournira des notifications par seconde pour informer l'utilisateur du temps restant à attendre; cela peut être supprimé en dirigeant la commande versNUL
.edit: Comme le souligne @martineau dans les commentaires , la
timeout
commande n'est disponible que sur Windows 7 et supérieur. De plus, laping
commande utilise moins de temps processeur quetimeout
. Je crois toujours qu'il faut utilisertimeout
là où c'est possible, car il est plus lisible que leping
«hack». En savoir plus ici .la source
ping
approche utilise moins de temps processeur.Mettez-le simplement dans votre fichier batch où vous voulez attendre.
la source
Dans le Bloc-notes, écrivez:
Enregistrez maintenant sous wait.bat dans le dossier C: \ WINDOWS \ System32, puis chaque fois que vous voulez attendre, utilisez:
la source
ping
ne pas effectuer quelque chose qu'une seule fois, et d'utiliser l'-w Timeout
option du temps de retard en millisecondes plutôt que l'-n Count
option du nombre entier de tentatives.-w Timeout
peut-être mieux, mais je me suis assuré qu'il pings une fois de plus que l'heure entrée.Le kit de ressources l' a toujours inclus. Au moins depuis Windows 2000.
De plus, le paquet Cygwin a un
sleep
- plop ça dans votre PATH et inclure lecygwin.dll
(ou ce qu'il appelle) et le chemin à parcourir!la source
J'aime la réponse d'Aacini . Je l'ai ajouté pour gérer la journée et lui permettre également de gérer centisecondes (
%TIME%
sortiesH:MM:SS.CC
):la source
J'utilise ce programme de veille C #. Cela peut être plus pratique pour vous si C # est votre langage préféré:
la source
Encore plus léger que la solution Python est un one-liner Perl.
Pour dormir pendant sept secondes, mettez ceci dans le script BAT:
Cette solution ne fournit qu'une résolution d'une seconde.
Si vous avez besoin d'une résolution plus élevée, utilisez le module Time :: HiRes du CPAN. Il fournit
usleep()
ce qui dort en microsecondes etnanosleep()
qui dort en nanosecondes (les deux fonctions ne prennent que des arguments entiers). Voir la question Stack Overflow Comment dormir pendant une milliseconde en Perl? pour plus de détails.J'utilise ActivePerl depuis de nombreuses années. Il est très facile à installer.
la source
Ou en ligne de commande Python, par exemple, pendant 6 secondes et demie:
la source
L'utilisation du ping est bonne, tant que vous voulez juste "attendre un peu". Ceci puisque vous dépendez d'autres fonctions en dessous, comme le fonctionnement de votre réseau et le fait que rien ne répond à 127.0.0.1. ;-) Il est peu probable que cela échoue, mais ce n'est pas impossible ...
Si vous voulez être sûr que vous attendez exactement l'heure spécifiée, vous devez utiliser le
sleep
fonctionnalité (qui présente également l'avantage de ne pas utiliser la puissance du processeur ou d'attendre qu'un réseau soit prêt).Trouver un exécutable déjà créé pour sleep est le moyen le plus pratique. Déposez-le simplement dans votre dossier Windows ou dans toute autre partie de votre chemin standard et il est toujours disponible.
Sinon, si vous disposez d'un environnement de compilation, vous pouvez facilement en créer un vous-même. La
Sleep
fonction est disponible danskernel32.dll
, il vous suffit donc de l'utiliser. :-) Pour VB / VBA, déclarez ce qui suit au début de votre source pour déclarer une fonction de veille:Pour C #:
Vous trouverez ici plus d'informations sur cette fonctionnalité (disponible depuis Windows 2000) dans la fonction Veille (MSDN).
En standard C,
sleep()
est inclus dans la bibliothèque standard et dans Visual Studio C de Microsoft, la fonction est nomméeSleep()
, si ma mémoire est bonne. ;-) Ces deux prennent l'argument en secondes, pas en millisecondes comme les deux déclarations précédentes.la source
La meilleure solution qui devrait fonctionner sur toutes les versions de Windows après Windows 2000 serait:
la source
'timeout' is not recognized as an internal or external command, operable program or batch file.
Le pathping.exe peut dormir moins d'une seconde.
.
la source
Je suis impressionné par celui-ci:
http://www.computerhope.com/batch.htm#02
Techniquement, vous dites à la
choice
commande d'accepter uniquement y. La valeur par défaut est y, pour le faire en 5 secondes, pour ne dessiner aucune invite et pour vider tout ce qu'il dit à NUL (comme un terminal nul sous Linux).la source
CHOICE
versions que je connais, si quelqu'un frappe une touche en attendant, ce que font parfois les gens impatients, alors le choix lira une entrée, émettra un bip système pour une mauvaise entrée et arrêtera le compte à rebours, donc il se bloquera à moins qu'ils n'appuient sur Y. Et s'ils poussent simplement Y, alors le choix s'arrête là au lieu d'attendre 5. De plus, ce choix utilise une syntaxe Vista vraiment étrange. Les commandes de choix normales utilisent à la placeCHOICE /T:Y,5 > NUL
pour cela. (Il n'y a pas d'indicateur / D dans les anciennes versions.) Et si vous avez Vista, utilisez à laTIMEOUT
place.Vous pouvez également utiliser un fichier .vbs pour effectuer des délais spécifiques:
Le code ci-dessous crée le fichier .vbs. Mettez ceci près du haut de votre code rbatch:
Le code ci-dessous ouvre alors le .vbs et spécifie combien de temps attendre:
Dans le code ci-dessus, le "1000" est la valeur de la temporisation à envoyer au fichier .vbs en millisecondes, par exemple, 1000 ms = 1 s. Vous pouvez modifier cette partie pour qu'elle soit aussi longue que vous le souhaitez.
Le code ci-dessous supprime le fichier .vbs une fois que vous en avez terminé. Mettez ceci à la fin de votre fichier batch:
Et voici le code dans son ensemble, il est donc facile à copier:
la source
À partir de Windows Vista, vous disposez des commandes TIMEOUT et SLEEP , mais pour les utiliser sous Windows XP ou Windows Server 2003, vous aurez besoin du kit d'outils de ressources Windows Server 2003 .
Ici, vous avez un bon aperçu des alternatives de sommeil (l'approche ping est la plus populaire car elle fonctionnera sur toutes les machines Windows), mais il y en a (au moins) une non mentionnée qui (ab) utilise la commande
W32TM
(Time Service):Où vous devez remplacer le N par les secondes que vous souhaitez mettre en pause. En outre, il fonctionnera sur tous les systèmes Windows sans prérequis.
Typeperf peut également être utilisé:
Avec mshta et javascript (peut être utilisé pour dormir moins d'une seconde):
Cela devrait être encore plus précis (pour attendre moins d'une seconde) - exécutable auto-compilable reposant sur
.net
:la source
Il existe de nombreuses façons d'accomplir un `` sommeil '' dans cmd / batch:
Mon préféré:
Cela arrêtera la console pendant 5 secondes, sans aucune sortie.
Plus utilisé:
Cela essaiera d'établir une connexion à
localhost
5 fois. Puisqu'il est hébergé sur votre ordinateur, il atteindra toujours l'hôte, donc chaque seconde il essaiera le nouveau chaque seconde. L'-n
indicateur indique combien de fois le script essaiera la connexion. Dans ce cas est 5, donc cela durera 5 secondes.Variantes de la dernière:
Dans ce script, il y a quelques différences en le comparant avec le dernier. Cela n'essaiera pas d'appeler
localhost
. Au lieu de cela, il essaiera de se connecter à1.1.1.1
un site Web très rapide. L'action ne durera 5 secondes que si vous disposez d'une connexion Internet active. Sinon, cela durera environ 15 pour terminer l'action . Je ne recommande pas d'utiliser cette méthode.C'est exactement la même chose que l'exemple 2 (le plus utilisé). En outre, vous pouvez également utiliser:
Cela utilise à la place la
localhost
version d'IPv6 .Il existe de nombreuses méthodes pour effectuer cette action. Cependant, je préfère la méthode 1 pour Windows Vista et les versions ultérieures et la méthode la plus utilisée (méthode 2) pour les versions antérieures du système d'exploitation.
la source
Vous pouvez avoir de la fantaisie en mettant le message PAUSE dans la barre de titre:
la source
Cela a été testé sur Windows XP SP3 et Windows 7 et utilise CScript. J'ai mis des gardes sûrs pour éviter les incitations "" del "". (
/q
serait dangereux)Attends une seconde:
Attendez 500 ms, puis exécutez les choses après:
sleepOrDelayExecution.bat:
la source
Puisque d'autres suggèrent des programmes tiers (Python, Perl, application personnalisée, etc.), une autre option est GNU CoreUtils pour Windows disponible à http://gnuwin32.sourceforge.net/packages/coreutils.htm .
2 options de déploiement:
L'un des avantages du déploiement de CoreUtils est que vous obtiendrez en outre une foule d'autres programmes utiles pour la création de scripts (le lot Windows laisse beaucoup à désirer).
la source