web-dev-qa-db-fra.com

Comment dormir pendant cinq secondes dans un fichier de commandes / cmd

L'outil Capture de Windows peut capturer l'écran, mais je souhaite parfois capturer l'écran au bout de cinq secondes, par exemple pour prendre une image affichée par la webcam. (Exécutez le script et souriez à la caméra, par exemple.)

Comment dormir 5 secondes dans un fichier batch?

640

Un hack consiste à (mal) utiliser la commande ping:

ping 127.0.0.1 -n 6 > nul

Explication:

  • ping est un utilitaire système qui envoie des demandes de ping. ping est disponible sur toutes les versions de Windows.
  • 127.0.0.1 est l'adresse IP de localhost . Il est garanti que cette adresse IP sera toujours résolue, accessible et répondra immédiatement aux pings.
  • -n 6 spécifie qu'il doit y avoir 6 pings. Il y a un délai de 1 s entre chaque ping, donc pour un délai de 5 s, vous devez envoyer 6 pings.
  • > nul supprime la sortie de ping, par redirection à nul .
795
Martin

Je suis très surpris que personne n'ait mentionné:

C:\> timeout 5

NB. Veuillez noter cependant (merci Dan!) Que timeout 5 signifie:

Dormez n'importe où entre 4 et 5 secondes

Ceci peut être vérifié de manière empirique en insérant ce qui suit dans un fichier de commandes, en l'exécutant de manière répétée et en calculant les différences de temps entre le premier et le second echos:

@echo off
echo %time%
timeout 5 > NUL
echo %time%
1356
asveikau

Essayez la commande Choice . Il existe depuis MSDOS 6.0 et devrait faire l'affaire.

Utilisez le paramètre/T pour spécifier le délai d'expiration en secondes et le paramètre/D pour spécifier la sélection par défaut et ignorer le choix sélectionné.

La seule chose qui pourrait être un problème est si l'utilisateur tape l'un des caractères de choix avant la fin du délai d'attente. Une solution partielle consiste à dissimuler la situation. Utilisez l’argument/N pour masquer la liste des choix valides et n’avoir que 1 caractère dans l’ensemble des choix. Il sera donc moins probable que l’utilisateur tape un choix valide avant le le délai d'attente expire.

Vous trouverez ci-dessous le texte d'aide sur Windows Vista. Je pense que c'est la même chose sur XP, mais regardez le texte d'aide sur un ordinateur XP à vérifier.

C:\>CHOICE /?

CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text]

Description:
    This tool allows users to select one item from a list
    of choices and returns the index of the selected choice.

Parameter List:
   /C    choices       Specifies the list of choices to be created.
                       Default list is "YN".

   /N                  Hides the list of choices in the Prompt.
                       The message before the Prompt is displayed
                       and the choices are still enabled.

   /CS                 Enables case-sensitive choices to be selected.
                       By default, the utility is case-insensitive.

   /T    timeout       The number of seconds to pause before a default
                       choice is made. Acceptable values are from 0 to
                       9999. If 0 is specified, there will be no pause
                       and the default choice is selected.

   /D    choice        Specifies the default choice after nnnn seconds.
                       Character must be in the set of choices specified
                       by /C option and must also specify nnnn with /T.

   /M    text          Specifies the message to be displayed before
                       the Prompt. If not specified, the utility
                       displays only a Prompt.

   /?                  Displays this help message.

   NOTE:
   The ERRORLEVEL environment variable is set to the index of the
   key that was selected from the set of choices. The first choice
   listed returns a value of 1, the second a value of 2, and so on.
   If the user presses a key that is not a valid choice, the tool
   sounds a warning beep. If tool detects an error condition,
   it returns an ERRORLEVEL value of 255. If the user presses
   CTRL+BREAK or CTRL+C, the tool returns an ERRORLEVEL value
   of 0. When you use ERRORLEVEL parameters in a batch program, list
   them in decreasing order.

Examples:
   CHOICE /?
   CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel."
   CHOICE /T 10 /C ync /CS /D y
   CHOICE /C ab /M "Select a for option 1 and b for option 2."
   CHOICE /C ab /N /M "Select a for option 1 and b for option 2."
68
Adam Porad

Le hack suivant vous permet de dormir pendant 5 secondes

ping -n 6 127.0.0.1 > nul

Comme ping attend une seconde entre les pings, vous devez en spécifier un de plus que nécessaire.

51
noctonura

Vous pouvez le faire avec timeout:

Ce sera visible: timeout 5

Ce ne sera pas visible timeout 5 >nul

38
Alex

Si vous avez PowerShell sur votre système, vous pouvez simplement exécuter cette commande:

powershell -command "Start-Sleep -s 5"

Edit: des personnes ont soulevé un problème selon lequel le temps nécessaire à PowerShell pour démarrer est important par rapport au temps que vous essayez d’attendre. Si la précision du temps d’attente est importante (c’est-à-dire qu’une ou deux secondes de retard supplémentaires ne sont pas acceptables), vous pouvez utiliser cette approche:

powershell -command "$sleepUntil = [DateTime]::Parse('%date% %time%').AddSeconds(5); $sleepDuration = $sleepUntil.Subtract((get-date)).TotalMilliseconds; start-sleep -m $sleepDuration"

Cela prend le temps quand la commande windows a été émise et le script powershell dort jusqu'à 5 secondes après cette heure. Donc, tant que le démarrage de powershell prend moins de temps que la durée de votre sommeil, cette approche fonctionnera (environ 600 ms sur ma machine).

37

Ne pouvons-nous pas faire waitfor /T 180?

waitfor /T 180 pause entraînera "ERREUR: expiration du délai d'attente pour 'pause'."

waitfor /T 180 pause >nul balayera cette "erreur" sous le tapis

La commande waitfor devrait figurer dans le système d'exploitation Windows après Win95.

Dans le passé, j'ai téléchargé un exécutable nommé sleep qui fonctionnera sur la ligne de commande après l'avoir placé dans votre chemin.

Par exemple: sleep shutdown -r -f /m \\yourmachine bien que l'arrêt ait maintenant l'option -t intégrée

29
joe li

Timeout /t 1 >nul

C’est comme une pause dans 1 seconde, vous pouvez porter le limé à près de 100.000 (99.999) secondes. Si vous êtes connecté à Internet, la meilleure solution serait:

ping 1.1.1.1. -n 1 -w 1000 >nul

Lorsque vous faites un ping, vous comptez en millisecondes, une seconde équivaut à 1 000 millisecondes. Mais la commande ping est un peu hasardeuse, cela ne fonctionne pas de la même manière sur les machines hors ligne. Le problème est que la machine est confuse car elle est hors ligne et elle aimerait envoyer un ping à un website/server/Host/ip, mais elle ne le peut pas. Donc, je recommanderais timeout. Bonne chance!

23
Jonathan

SLEEP 5 était inclus dans certains des kits de ressources Windows.

TIMEOUT 5 était inclus dans certains des kits de ressources Windows, mais est maintenant une commande standard dans Windows 7 et 8 (vous n'êtes pas sûr de Vista).

PING 1.1.1.1 -n 1 -w 5000 >NUL Pour toute version MS-DOS ou Windows avec un client TCP/IP, PING peut être utilisé pour retarder l'exécution d'un nombre de secondes.

NETSH badcommand (Windows XP/Server 2003 uniquement) ou CHOICE

ce lien vous aidera plus .

20
Amir

Deux réponses:

Premièrement, pour retarder un fichier de commandes, simplement sans toutes les méthodes obtuses proposées par les gens:

timeout /t <TimeoutInSeconds> [/nobreak] 

http://technet.Microsoft.com/en-us/library/cc754891.aspx

Deuxièmement, il convient de mentionner que, même s’il ne fait pas exactement ce que vous voulez, à l’aide de l’outil de découpage intégré à Windows, vous pouvez déclencher une coupure sur celui-ci sans utiliser la souris. Exécutez l'outil de capture, sortez de la capture actuelle, mais laissez-le en cours d'exécution, puis appuyez sur Ctrl + Imprimer l'écran lorsque vous souhaitez que la capture se produise. Cela ne devrait pas interférer avec ce que vous essayez de couper.

12
Ned Martin

J'essayais de faire cela à partir d'une tâche msbuild, et le choix et l'expiration du délai ne fonctionnaient pas tous les deux en raison de la redirection des E/S.

J'ai fini par utiliser sleep.exe à partir de http://sourceforge.net/projects/unxutils , ce qui est agréable car il ne nécessite aucune installation et est minuscule.


Essayer avec choice:

<Target Name="TestCmd">
  <Exec Command="choice /C YN /D Y /t 5 " />
</Target>

Résulte en:

TestCmd:
  choice /C YN /D Y /t 5

EXEC : error : The file is either empty or does not contain the valid choices. [test.proj]
  [Y,N]?
C:\test.proj(5,9): error MSB3073: The command "choice /C YN /D Y /t 5 " exited with code 255.

Essayer avec timeout:

<Target Name="TestCmd">
  <Exec Command="timeout /t 5 " />
</Target>

Résulte en:

TestCmd:
  timeout /t 5
EXEC : error : Input redirection is not supported, exiting the process immediately. [test.proj]
C:\test.proj(5,7): error MSB3073: The command "timeout /t 5 " exited with code 1.

De côté:

En fait, j'utilise <Exec Command="sleep 2 & dbghost.exe" /> parce que j'exécute dbghost.exe plusieurs fois en parallèle et qu'il crée des fichiers/bases de données temporaires en fonction du temps Epoch actuel en secondes - ce qui signifie bien sûr que si vous démarrez plusieurs instances, les mêmes utilisent nom temporaire. À l'origine, j'essayais d'utiliser la commande MSBuild Extension Pack Thread.Sleep, mais il semble que (généralement), elle exécutait correctement la tâche de veille, mais démarrait ensuite la tâche <exec> dans tous les threads, et Bien entendu, dbghost.exe échouerait avec des conflits. Jusqu'à présent, utiliser sleep.exe semble être plus fiable.

11
gregmac

Ceci est la dernière version de ce que j'utilise en pratique pendant une pause de dix secondes pour voir la sortie lorsqu'un script se termine.

BEST>@echo done
BEST>@set DelayInSeconds=10
BEST>@rem Use ping to wait
BEST>@ping 192.0.2.0 -n 1 -w %DelayInSeconds%000 > nul

L'écho effectué me permet de voir quand le script est terminé et le ping fournit le délai. Les signes supplémentaires @ signifient que je vois le texte "Terminé" et l'attente se produit sans que je sois distrait par leurs ordres.

J'ai essayé les différentes solutions données ici sur une machine XP, car l'idée était de disposer d'un fichier de commandes pouvant s'exécuter sur plusieurs machines. J'ai donc choisi la machine XP. comme l'environnement susceptible d'être le moins capable.

GOOD> ping 192.0.2.0 -n 1 -w 3000 > nul

Cela semblait donner un délai de trois secondes comme prévu. Une tentative de ping d'une durée spécifiée de 3 secondes.

BAD> ping -n 5 192.0.2.0 > nul

Cela a pris environ 10 secondes (pas 5). Mon explication est qu'il y a 5 tentatives de ping, chacune à une seconde d'intervalle, soit 4 secondes. Et chaque tentative de ping a probablement duré environ une seconde, soit environ 9 secondes au total.

BAD> timeout 5
BAD> sleep /w2000
BAD> waitfor /T 180
BAD> choice

Commandes non disponibles.

BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs

J'ai aussi essayé ce qui précède, après avoir lu que des commentaires pouvaient être ajoutés aux fichiers BAT en utilisant deux points-virgules consécutifs. Cependant, le logiciel est revenu presque instantanément. Mettre le commentaire sur sa propre ligne avant le ping fonctionnait bien.

GOOD> :: wait 10000 milliseconds, ie 10 secs
GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul

Pour mieux comprendre ce que le ping fait en pratique, j’ai couru

ping 192.0.2.0 -n 5 -w 5000

Cela a pris environ 30 secondes, même si 5 * 5 = 25. Mon explication est qu'il y a 5 tentatives de ping d'une durée de 5 secondes chacune, mais il y a un délai d'environ 1 seconde entre les tentatives de ping: après tout, il y a peu de raisons de s'attendre à un résultat différent si vous pingez à nouveau immédiatement et il est préférable de donner un résultat différent. réseau un peu de temps pour récupérer de n'importe quel problème qu'il a eu.

Edit: volé à partir de n autre article , .. RFC 33 indique que l'adresse IP 192.0.2.0 ne doit pas apparaître sur Internet, afin que cette adresse Ping empêche ces tests de spammer qui que ce soit! J'ai modifié le texte ci-dessus en conséquence!

6
Ivan

deux autres façons de fonctionner à partir de XP et au-dessus:

avec w32tm

w32tm /stripchart /computer:localhost /period:5 /dataonly /samples:2  1>nul 

avec typeperf:

typeperf "\System\Processor Queue Length" -si 5 -sc 1 >nul
6
npocmaka

J'ai fait ça. Cela fonctionne et montre le temps restant en secondes. Si vous voulez l'utiliser, ajoutez-le à un fichier de commandes:

call wait 10

Cela fonctionnait quand je l'ai testé.

Liste de wait.bat (il doit figurer dans le répertoire de travail ou windir/system32/):

@echo off

set SW=00

set SW2=00

set /a Sec=%1-1

set il=00
@echo Wait %1 second
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC, SW=CC 

set /a TFIN=%TBASE%+%100

:ESPERAR
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, 

CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC,  SW2=CC


if %SW2% neq %SW% goto notype
if %il%==0 (echo Left %Sec% second & set /a Sec=sec-1 & set /a il=il+1)
goto no0
:notype
set /a il=0
:no0

if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
if %TACTUAL% lss %TFIN% goto ESPERAR
5
user1884308

Vous pouvez utiliser VBScript , par exemple, fichier myscript.vbs:

set wsobject = wscript.createobject("wscript.Shell")

do while 1=1
    wsobject.run "SnippingTool.exe",0,TRUE
    wscript.sleep 3000
loop

Fichier de lot:

cscript myscript.vbs %1
4
Dani

Une amélioration du code proposé par l'utilisateur Aacini, il a une résolution de centièmes de seconde et n'échoue pas lorsque le temps atteint 23: 59: 59,99:

for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TBASE=((HH*60+MM)*60+SS)*100+CC

:: Example delay 1 seg.
set /a TFIN=%TBASE%+100

:ESPERAR
for /f "tokens=1,2,3,4 delims=:," %%A in ("%TIME%") do set /a HH=%%A, MM=1%%B-100, SS=1%%C-100, CC=1%%D-100, TACTUAL=((HH*60+MM)*60+SS)*100+CC

if %TACTUAL% lss %TBASE% set /a TACTUAL=%TBASE%+%TACTUAL%
if %TACTUAL% lss %TFIN% goto ESPERAR
3
Rober

Cela peut être fait avec deux lignes simples dans un fichier batch: écrivez un fichier temporaire .vbs dans le dossier %temp% et appelez-le:

echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
3
AjV Jsy

La façon la plus simple de le faire était la suivante:

Téléchargez le fichier Sleep.exe à l’adresse http://www.sleepcmd.com/ . Le fichier .exe doit être dans le même dossier que le programme que vous avez écrit!

3
Xavi

J'utilise la méthode suivante entièrement basée sur les fonctionnalités de Windows XP pour effectuer un délai dans un fichier de traitement par lots:

Fichier DELAY.BAT

@ECHO OFF
REM DELAY seconds

REM GET ENDING SECOND
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100,     S=1%%C%%100, ENDING=(H*60+M)*60+S+%1

REM WAIT FOR SUCH A SECOND
:WAIT
FOR /F "TOKENS=1-3 DELIMS=:." %%A IN ("%TIME%") DO SET /A H=%%A, M=1%%B%%100, S=1%%C%%100, CURRENT=(H*60+M)*60+S
IF %CURRENT% LSS %ENDING% GOTO WAIT

Vous pouvez également insérer le jour dans le calcul pour que la méthode fonctionne également lorsque l'intervalle de retard dépasse minuit.

3
Aacini
PING -n 60 127.0.0.1>nul

dans le cas où votre adaptateur LAN n'est pas disponible.

2
user3584216

Si vous possédez une version appropriée de Windows et que Outils du Kit de ressources Windows Server 20 , il inclut une commande de veille pour les programmes de traitement par lots. Plus à: http://malektips.com/xp_dos_0002.html

2
GreenMatt

Créez un fichier cmd appelé sleep.cmd:

REM Usage: SLEEP Time_in_MiliSECONDS
@ECHO off
ping 1.0.0.0 -n 1 -w %1 > nul

Copiez sleep.cmd dans c:\windows\system32

Usage:

sleep 500

Dort pendant 0,5 seconde. Arguments en ms. Une fois copié sur System32, peut être utilisé partout.

EDIT: Vous devriez également vous écarter du fait que si la machine n’est pas connectée à un réseau (par exemple un portable que vous utilisez dans le métro), l’astuce de ping ne fonctionne plus vraiment.

1
thebunnyrules

Dans Windows XP SP3, vous pouvez utiliser la commande de sommeil

1
Andres

le ping attend environ 5 secondes avant l'expiration du délai, pas 1 seconde comme indiqué ci-dessus. C’est-à-dire que, à moins que vous n’indiquiez qu’il n’attende qu’une seconde avant d’expirer.

ping 1.0.0.1 -n 1 -w 1000

fera un ping une fois, attendez seulement 1 seconde (1000 ms) pour une réponse, puis expirez.

Donc, un délai d'environ 20 secondes serait:

ping 1.0.0.1 -n 20 -w 1000

0
LionelGoulet

Cela fonctionne si vous avez le choix ou le ping.

@echo off
echo.
if "%1"=="" goto askq
if "%1"=="/?" goto help
if /i "%1"=="/h" goto help
if %1 GTR 0 if %1 LEQ 9999 if /i "%2"=="/q" set ans1=%1& goto quiet
if %1 GTR 0 if %1 LEQ 9999 set ans1=%1& goto breakout
if %1 LEQ 0 echo %1 is not a valid number & goto help
if not "%1"=="" echo.&echo "%1" is a bad parameter & goto help
goto end

:help
echo SLEEP runs interactively (by itself) or with parameters (sleep # /q )
echo where # is in seconds, ranges from 1 - 9999
echo Use optional parameter /q to suppress standard output 
echo or type /h or /? for this help file
echo.
goto end

:askq
set /p ans1=How many seconds to sleep? ^<1-9999^> 
echo.
if "%ans1%"=="" goto askq
if %ans1% GTR 0 if %ans1% LEQ 9999 goto breakout
goto askq

:quiet
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
goto end

:breakout
choice /n /t %ans1% /d n > nul
if errorlevel 1 ping 1.1.1.1 -n 1 -w %ans1%000 > nul
echo Slept %ans1% second^(s^)
echo.

:end

nommez-le simplement sleep.cmd ou sleep.bat et lancez-le

0
Doctor DOS

J'ai écrit un programme powerbasic wait.exe, dans lequel vous lui transmettez un paramètre milliseconde dans votre fichier de commandes.

wait 3000
system('c:/windows/system32/SnippingTool.exe')

le code pour le fichier EXE:

FUNCTION PBMAIN()
  c$ = Command$
  s! = Val(c$)*1000
  Sleep s!         
END FUNCTION
0
Shawn