Dormir dans un fichier de commandes
Lors de l'écriture d'un fichier batch pour automatiser quelque chose sur une zone de Windows, j'ai eu besoin de prendre une pause dans son exécution pendant plusieurs secondes (généralement dans un test/boucle d'attente, en attente d'un processus de départ). À l'époque, la meilleure solution que j'ai pu trouver utilise ping (je ne plaisante pas) pour obtenir l'effet désiré. J'ai trouvé une meilleure écriture-up de ici, qui décrit un callable "attendre.chauve-souris", mis en œuvre 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 des appels à attendre.chauve-souris dans votre propre fichier de commandes, en passant le nombre de secondes à attendre.
Apparemment, Windows 2003 Resource Kit fournit un Unix-like commande de mise en veille (enfin!). En attendant, pour ceux d'entre nous utilisent encore Windows XP, Windows 2000 ou (malheureusement) Windows NT, est-il un meilleur moyen?
J'ai modifié le sleep.py
script dans le accepté de répondre à, de sorte que la valeur par défaut est 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)
- Microsoft page de téléchargement de la Windows 2003 Resource Kit indique qu'il fonctionne aussi pour XP. J'ai peur, il n'y a pas d'autre choix que d'utiliser un "externe" de l'utilitaire de faire le d'attente: il n'y a rien de tel que ce construit dans le XP processeur de commande.
- L'server 2003 resource kit fonctionne avec Windows XP (et probablement avec w2k)
- J'ai connu le même problème dans le passé, et utilisé ping moi-même (avec une remarque au-dessus de documenter clairement que je réalise que c'est stupide 🙂 ).
- Vérifier: la mise en Œuvre de la Commande d'ATTENTE dans un Fichier de commandes fichier de commandes Commande de mise en VEILLE
- Vous avez deux options - émuler un sommeil avec le
ping
commande, ou télécharger le kit de ressources de windows qui comprend unsleep
de commande. Plus de détails ici: fichier de commandes Commande de mise en VEILLE - Voici quelques options de batch file d'attente
- stackoverflow.com/questions/5437201/... stackoverflow.com/questions/1304738/wait-in-console stackoverflow.com/questions/4908495/... " stackoverflow.com/questions/166044/sleeping-in-a-dos-batch-file
- État
%1
plutôt que%1%
pour désigner le premier argument de ligne de commande... - Un bon résumé des différentes techniques pour mettre un terme à un fichier de commandes: robvanderwoude.com/wait.php
Vous devez vous connecter pour publier un commentaire.
Si vous avez installé Python, ou n'avez pas l'esprit de l'installer (il a d'autres utilisations aussi :), il suffit de créer le suivant sleep.py script et l'ajouter quelque part dans votre PATH:
Il permettra à des sous-deuxième pauses (par exemple, 1,5 s, 0.1, etc.), si vous avez un tel besoin. Si vous voulez appelez ça comme
sleep
plutôt quesleep.py
, vous pouvez ensuite ajouter les.PY
extension à votre variable d'environnement PATHEXT. Sur Windows XP, vous pouvez le modifier dans:Mon Ordinateur → Propriétés (menu) → Avancé (onglet) → les Variables d'Environnement (bouton) → les variables du Système (cadre)
Mise à JOUR: Le
timeout
de commande, disponible à partir de Windows Vista et suivants devraient être la commande utilisé, comme décrit dans un autre réponse à ce quiestion.La
timeout
de commande est disponible à partir de Windows Vista à partir de:Remarque: Il ne fonctionne pas avec la redirection d'entrée - exemple trivial:
timeout
ajouté par @Cristian Ciupitu, est partiellement faux -- Windows XP ne dispose pas de cette commande.À l'aide de la
ping
méthode décrite est de savoir comment je le fais quand je ne peux pas (ou ne veulent pas) ajouter plus de fichiers exécutables ou d'installer d'autres logiciels.Vous devez être une requête ping à quelque chose qui n'est pas là, et à l'aide de la
-w
drapeau alors qu'il échoue au bout de ce laps de temps, pas de ping quelque chose qui est là (comme localhost)-n
fois. Cela permet de gérer le temps de moins d'une seconde, et je pense que c'est un peu plus précis.par exemple
(test 1.1.1.1 n'est pas pris)
PING: transmit failed. General failure.
1.1.1.1
est pris par CloudFlare, ce qui permettra de ne pas attendre 15s mais autour de certains états membres.Je suis en désaccord avec les réponses que j'ai trouvé ici.
J'utilise la méthode suivante entièrement basé sur Windows XP capacités de faire un retard dans un fichier de commandes:
RETARD.Chauve-souris:
Vous pouvez également insérer la journée dans le calcul de sorte que la méthode fonctionne également lorsque l'intervalle de temps de passer au-dessus de minuit.
TIME
de commande.Illegal number. Numeric constants are either decimal (17), hexadecimal (0x11) or octal (021) numbers
.ping
méthode immédiatement après laWAIT:
étiquette, par exemplePING 1.1.1.1 -n 1 -w 500 > NUL
. Ce changement signifie que le fichier de commandes passe la grande majorité de son temps à l'intérieur de la table de ping timeout, qui sans doute ne pas consommer d'importants cycles de PROCESSEUR.illegal number
une erreur de script est parce que dans unset
commande, lot suppose tout littéral numérique en commençant par0
est octal, de sorte08
et09
voyage jusqu'à. Je viens d'ajouter un couple de vérifier les déclarations, donc si je veux obtenir le nombre de secondes de l'heure actuelle:set Secs=%time:~6,2%
,if %Secs%==08 set Secs=8
,if %Secs%==09 set Secs=9
.SET /A S=1%%C%%100
. Si les secondes sont08
, précédente commande est exécutée de cette façon:SET /A S = 108 % 100
que l'ensemble S = 8, ce qui signifie queIllegal number
erreur jamais se produire ici. Avez-vous testé?C:\Temp>delay.bat 5 Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17), hexadezimale (0x11) oder oktale (021) Zahlen.
Le message d'erreur dit qu'un nombre est non valide. Le retard semble fonctionner, cependant.@ECHO OFF
ligne, utilisez le code avec 1 seconde et après la POUR et de DÉFINIR les lignes de la question de l'erreur, s'il vous plaît? Par exemple:FOR /F "TOKENS=1-3 DELIMS=:." %A IN (" 6:56:34.14") DO SET /A H=%A, M=1%B%100,S=1%C%100, CURRENT=(H*60+M)*60+S
etSET /A H= 6, M=156%100, S=134%100, CURRENT=(H*60+M)*60+S
.illegal number
erreur de ce fichier de commandes et d'afficher les mêmes données que j'ai demandé en commentaire précédent, s'il vous plaît? TIA@echo off
, aucun message d'erreur est imprimé. Voici le résultat: collé.co/757bf8f7%TIME%
utilisez une virgule pour séparer les centièmes de seconde, au lieu d'un point! Il suffit d'ajouter une virgule dansDELIMS=:.,"
...SLEEP.exe
est inclus dans la plupart des Kits de Ressources par exemple Windows Server 2003 Resource Kit qui peut être installé sur Windows XP trop.J'ai fait face à un problème similaire, mais je viens juste d'en haut une très courte application console C++ pour faire la même chose. Il suffit d'exécuter MySleep.exe 1000 - peut-être plus facile que le téléchargement/installation de l'ensemble du kit de ressources.
Plus sur le Serveur Faute, une question semblable a été posée, la solution, il y avait:
CHOICE
versions je sais, si quelqu'un frappe un bouton tout en attente, impatient de gens parfois, puis choix va enregistrer une entrée, donner un système sonore à une mauvaise entrée, et de stopper le compte à rebours, ce qui signifie qu'il va s'accrocher à moins qu'ils poussent N ou Y. Et si ils ont juste arriver à pousser un de ces deux, alors le choix s'arrête là, au lieu d'attendre 5. Aussi, ce choix est à l'aide de vraiment bizarre Vista syntaxe. Tous les choix de commandes au lieu d'utiliserCHOICE /T:Y,5 > NUL
pour que. Il n'y a pas de/D
drapeau dans les anciennes versions./C:YN
ou tout simplement/C:Y
, ce n'est pas d'aller travailler quand quelqu'un arrive à avoir, disons, un suédois choix de commande qui va probablement faire un [J,N] par défaut. Donc, c'est embourbé dans toutes sortes d'ennuis.Vous pouvez utiliser le Windows cscript WSH couche et ce wait.js fichier JavaScript:
En fonction de vos exigences de compatibilité, soit utiliser
ping
:par exemple, attendre 5 secondes, l'utilisation
ou sur Windows 7 ou une version ultérieure utiliser
timeout
:-w
est en millisecondes,-n
est juste le nombre de fois à de ping et l'heure par défaut entre les pings en est une seconde.Vous pouvez utiliser la commande ping:
Il faudra attendre 10 secondes.
La raison pour laquelle vous devez utiliser 11 est parce que le premier ping sort immédiatement, pas au bout d'une seconde. Le nombre doit toujours être un de plus que le nombre de secondes que vous voulez attendre.
Garder à l'esprit que le but de la
-w
est de ne pas attendre une seconde. C'est pour s'assurer que vous n'attendez plus qu'une seconde dans le cas où il y a des problèmes de réseau.ping
sur ses propres va envoyer un paquet ICMP par seconde. Ce n'est probablement pas nécessaire pour localhost, mais les vieilles habitudes ont la vie dure.-w
a été le délai d'attente (même si j'avoue que certains pourraient en déduire qu'en raison de mon manque de clarté), il est en fait utilisé pour limiter le temps de cycle où il y a des problèmes de réseau qui serait la cause de chaque cycle pour prendre plus que son alloués à la seconde. J'ai ajouté un paragraphe à la fin pour clarifier cela.Il y a une meilleure façon de dormir à l'aide de la commande ping. Vous aurez envie de ping à une adresse qui n'existe pas, de sorte que vous pouvez spécifier un timeout avec précision à la milliseconde. Heureusement, cette adresse est définie dans une norme (RFC 3330), et il est
192.0.2.x
. Ce n'est pas fait, c'est vraiment une adresse à la seule fin de non-existant (il peut ne pas être clair, mais il s'applique même dans les réseaux locaux):Pour dormir, pour 123 millisecondes, l'utilisation
ping 192.0.2.1 -n 1 -w 123 >nul
-n
paramètre.ping 192.0.2.1
sur ce PC Windows et il peut être vu que la pile TCP/IP Windows réponses sur les 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
en raison de sa diffusion adresse de bouclage dans Windows qui est déjà attribué par défaut (Vous pouvez le vérifier en exécutantroute print
dans cmd et à la recherche par le biais de la table de routage IPv4 de l'impression).Par exemple, pour rendre le script effectuer une non sans coupure de 2 secondes d'attente:
Ce qui signifie que le script va attendre 2 secondes avant de continuer.
Par défaut, d'une touche permet d'interrompre le délai d'attente, donc utiliser le
/nobreak
commutateur si vous ne voulez pas que l'utilisateur soit en mesure d'interrompre (annuler) l'attente. En outre, le délai d'attente fournira par la deuxième notification pour notifier à l'utilisateur combien de temps est laissé à attendre; ce peut être retiré par la tuyauterie de la commande àNUL
.edit: Comme @martineau points dans les commentaires, le
timeout
commande n'est disponible que sur Windows 7 et au-dessus. En outre, laping
commande utilise de moins en moins de temps processeur quetimeout
. Je crois encore à l'aide detimeout
si possible, même si, comme il est plus lisible que leping
"hack". Lire plus ici.ping
approche utilise moins de temps processeur.Il suffit de mettre ceci dans votre fichier de commandes où vous voulez l'attendre.
Dans le bloc-notes, écrire:
Enregistrer maintenant que d'attendre.bat dans le dossier C:\WINDOWS\System32,
alors à chaque fois que vous voulez attendre, utilisation:
ping
quelque chose de pas juste une fois et utilisez le-w Timeout
option pour le temps de retard en millisecondes plutôt que de la-n Count
nombre entier de tentatives option.-w Timeout
peut-être mieux, mais j'ai fait en sorte qu'il pings une fois de plus que le temps défini.Si vous avez PowerShell sur votre système, vous pouvez exécuter cette commande:
Edit: a partir de ma réponse sur un fil similaire, les gens soulevé un point où la quantité de temps powershell faut pour démarrer est significative par rapport à combien de temps vous êtes en train d'attendre. Si la précision de la durée d'attente est importante (c'est à dire une ou deux secondes de délai supplémentaire n'est pas acceptable), vous pouvez utiliser cette approche:
Cela prend du temps, alors que les fenêtres de commande a été émis, et le script powershell dort jusqu'à 5 secondes après que le temps. Donc, tant que powershell prend moins de temps à démarrer que votre durée de sommeil, cette approche permettra de travailler (c'est autour de 600ms sur ma machine).
La Kit De Ressources a toujours inclus cette. Au moins depuis Windows 2000.
Aussi, l'environnement Cygwin est un
sleep
- plop-la dans votre CHEMIN et comprennent lacygwin.dll
(ou quelque chose comme ça) et de chemin à faire!J'aime Aacini réponse. J'ai rajouté à la poignée de la journée et aussi lui permettre de gérer centièmes de seconde (
%TIME%
sortiesH:MM:SS.CC
):J'ai été en utilisant cette C# programme de sommeil. Il peut être plus pratique pour vous si C# est la langue de votre choix:
Ou de la ligne de commande Python, par exemple, pour les 6 secondes et demi:
L'utilisation de ping est bon, aussi longtemps que vous voulez juste "attendre un peu". Puisque vous êtes dépendant des autres fonctions de l'en-dessous, à l'instar de votre réseau de travail et le fait qu'il n'y a rien à répondre sur 127.0.0.1. 😉 Peut-être qu'il n'est pas très probable, il échoue, mais il n'est pas impossible...
Si vous voulez être sûr que vous attendez exactement le temps imparti, vous devez utiliser le
sleep
fonctionnalité (qui ont aussi l'avantage de ne pas utiliser la puissance du CPU ou attendre un réseau de prêt).De trouver une déjà faite exécutable pour le sommeil est le moyen le plus pratique. Il suffit de déposer dans votre dossier Windows ou toute autre partie de votre chemin d'accès standard et il est toujours disponible.
Sinon, si vous avez une compilation de l'environnement, vous pouvez facilement faire vous-même.
Le
Sleep
fonction est disponible danskernel32.dll
, donc vous avez juste besoin d'utiliser celle-ci. 🙂Pour VB /VBA déclare ce qui suit au début de votre source de déclarer une fonction de veille:
Pour C#:
Vous trouverez ici plus à propos de cette fonctionnalité (disponible depuis Windows 2000) dans Fonction de veille (MSDN).
Dans la norme C,
sleep()
est inclus dans la bibliothèque standard et dans Microsoft Visual Studio C la fonction est nomméeSleep()
, si la mémoire me sert. 😉 Ces deux prend l'argument en quelques secondes, pas en millisecondes comme les deux précédentes déclarations.Même plus léger que le Python solution est de Perl
one-liner.
Dormir pendant sept secondes de mettre cela dans la chauve-souris script:
Cette solution ne fournit une résolution d'une seconde.
Si vous avez besoin de plus haute résolution puis utilisez le Time::HiRes
module CPAN. Il fournit
usleep()
qui dort dansmicrosecondes et
nanosleep()
qui dort en nanosecondes(les deux fonctions ne prend que les arguments entiers). Voir la
Pile Overflow question Comment puis-je dormir pendant un millième de seconde en Perl? pour plus de détails.
J'ai utilisé ActivePerl depuis de nombreuses années. Il est très facile à
installer.
La meilleure solution qui devrait fonctionner sur toutes les versions de Windows après l'installation de Windows 2000:
'timeout' is not recognized as an internal or external command, operable program or batch file.
L'pathping.exe peut de sommeil de moins de seconde.
.
Je suis impressionné par celui-ci:
http://www.computerhope.com/batch.htm#02
Techniquement, vous racontez l'
choice
de commande pour accepter uniquement les y de. La valeur par défaut y, à le faire dans les 5 secondes, de ne pas tracer de commandes, et de vider tout ce qu'il ne dis NUL (comme nulle terminal sous Linux).CHOICE
versions je sais, si quelqu'un frappe une touche pendant l'attente, qui s'impatiente de gens parfois, puis choix va lire une entrée, donner un système sonore à une mauvaise entrée, et de stopper le compte à rebours, de sorte qu'il va s'accrocher à moins qu'ils poussent Y. Et si ils ont juste arriver à pousser de Y, alors le choix s'arrête là, au lieu d'attendre 5. Aussi, ce choix est à l'aide de vraiment bizarre Vista syntaxe. Les options habituelles commandes au lieu d'utiliserCHOICE /T:Y,5 > NUL
pour que. (Il n'y a pas de /D option dans les anciennes versions.) Et si vous avez Vista, utilisezTIMEOUT
à la place.À partir de Windows Vista, vous avez la DÉLAI d'attente et Le SOMMEIL commandes, mais de les utiliser sur Windows XP ou Windows Server 2003, vous aurez besoin de la Windows Server 2003 resource kit d'outil de.
Ici vous avez un bon aperçu de sommeil alternatives (le ping approche est la plus populaire car elle fonctionne sur tous les Windows de la machine), mais il y a (au moins) un pas mentionné (ab)utilise le
W32TM
(Temps de Service) commande:Où vous devez remplacer le N par le nombre de secondes que vous voulez mettre en pause. Aussi, il fonctionne sur tout système Windows sans conditions préalables.
Typeperf peut également être utilisé:
Vous pouvez également utiliser un .fichier vbs pour faire des timeouts:
Le code ci-dessous crée la .fichier vbs. Mettre cette près du haut de vous rbatch code:
Le code ci-dessous s'ouvre alors la .vbs et spécifie combien de temps à attendre:
Dans le code ci-dessus, le "1000" est la valeur du temps de retard pour être envoyé à l' .fichier vbs en millisecondes, par exemple, 1000 ms = 1 s. Vous pouvez modifier la présente partie, aussi longtemps que vous le souhaitez.
Le code ci-dessous supprime le .fichier vbs, après vous avez terminé avec elle. Mettre ceci à la fin de votre fichier de commandes:
Et voici le code qui, tous ensemble, de sorte qu'il est facile de copier:
Vous pouvez obtenir la fantaisie en mettant le message de PAUSE dans la barre de titre:
Cela a été testé sur Windows XP SP3 et Windows 7 et utilise CScript. Je l'ai mis dans certains gardes de sécurité pour éviter la del "" l'impulsion. (
/q
serait dangereux)Attendez une seconde:
Attendre de 500 ms et exécutez ensuite trucs après:
sleepOrDelayExecution.chauve-souris:
Depuis d'autres proposent des programmes de 3ème partie (Python, Perl, de l'application personnalisée, etc), une autre option est de GNU CoreUtils pour Windows disponible à http://gnuwin32.sourceforge.net/packages/coreutils.htm.
2 options pour le déploiement:
L'un des avantages du déploiement de CoreUtils, c'est que vous aurez en outre d'obtenir une foule d'autres programmes qui sont utiles pour l'écriture de scripts (Windows batch laisse beaucoup à désirer).
Remplacer X par le nombre de secondes + 1.
Par exemple, si vous attendez 10 secondes, remplacer X par 11. Attendre 5 secondes, utilisation 6.
Lire les réponses précédentes pour millisecondes.