Comment dormir 5 secondes dans L'invite de commande de Windows? (ou DOS) [duplicate]
cette question a déjà une réponse ici:
- comment attendre dans un script batch? [duplicate] 6 réponses
L'outil de découpage de Windows peut capturer l'écran, mais parfois je veux capturer l'écran après 5 secondes, comme prendre une image affichée par la webcam. (exécuter le script et sourire à la caméra, par exemple).
donc en Ruby, je pourrais faire quelque chose comme
sleep 3
system('c:/windows/system32/SnippingTool.exe')
mais tous les ordinateurs N'ont pas de rubis, alors comment je fais ça en a.le dossier bat? (quelque chose qui est exécutable sur la plupart des PC avec outil de flexion).
Le problème est qu'il n'y a pas de "sommeil" utilisable dans un .le fichier bat.
30 réponses
un hack que j'ai vu est d'utiliser (mis)la commande ping:
ping 127.0.0.1 -n 6 > nul
127.0.0.1
est l'adresse IP locale.
-n 6
- il y a un délai de 1s entre chaque ping, donc pour un délai de 5s vous devez faire 6 pings.
> nul
- supprimez la sortie.
je suis très surpris que personne n'ait mentionné:
C:\> timeout 5
N. B. s'il vous Plaît noter, cependant (merci Dan!) que timeout 5
signifie:
dormir entre 4 et 5 secondes
cela peut être vérifié empiriquement en mettant ce qui suit dans un fichier batch, en l'exécutant à plusieurs reprises et en calculant les différences de temps entre le premier et le deuxième echo
s:
@echo off
echo %time%
timeout 5 > NUL
echo %time%
essayez la commande Choice . Elle existe depuis MSDOS 6.0, et devrait faire l'affaire.
utilise le paramètre /T pour spécifier le délai en secondes et le paramètre / D pour spécifier la sélection par défaut et ignore ensuite le choix sélectionné.
La seule chose qui pourrait être un problème si l'utilisateur tape l'un des choix les caractères avant le délai est écoulé. Une solution partielle est d'obscurcir la situation -- utilisez l'argument / N Pour masquer la liste des choix valides et avoir seulement 1 caractère dans l'ensemble des choix de sorte qu'il sera moins probable que l'utilisateur Tapera un choix valide avant que le délai expire.
ci-dessous est 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 pour 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."
rem *** HACK ALERT: Sleep for 5 seconds ***
ping -n 6 127.0.0.1 > nul
rem ***************************************
- fixé comme expliqué par @Joey
vous pouvez le faire avec timeout
:
ce sera visible: timeout 5
ce ne sera pas visible timeout 5 >nul
si vous avez PowerShell sur votre système, vous pouvez juste exécuter cette commande:
powershell -command "Start-Sleep -s 5"
Edit: les gens ont soulevé une question où le temps de powershell prend pour commencer est importante par rapport à combien de temps vous essayez d'attendre. Si l'exactitude du temps d'attente est importante (c.-à-d. qu'un ou deux délais 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"
This prend le temps où la commande windows a été émise, et le script powershell dort jusqu'à 5 secondes après ce temps. Aussi longtemps que powershell prend moins de temps à démarrer que votre durée de sommeil, cette approche fonctionnera (c'est environ 600m sur ma machine).
ne peut-on pas faire waitfor /T 180
?
waitfor /T 180 pause
résultera en" erreur: chronométré en attente de 'pause'."
waitfor /T 180 pause >nul
balaiera cette "erreur" sous le tapis
la commande waitfor
doit être présente dans Windows OS 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 que vous l'ayez mis sur votre chemin.
pour exemple: sleep shutdown -r -f /m \yourmachine
bien que shutdown ait maintenant l'option-t intégrée dans
Timeout /t 1 >nul
est comme pause dans 1 seconde, vous pouvez prendre la limousine à presque 100.000 (99.999) secondes. Si vous êtes connecté à internet, la meilleure solution serait:
ping 1.1.1.1. -n 1 -w 1000 >nul
quand vous ping vous comptez en millisecondes, donc une seconde serait de 1000 millisecondes. Mais la commande ping est un peu difficile, elle ne fonctionne pas de la même façon sur les machines hors ligne.
Le problème est que la machine devient confus parce qu'il est déconnecté, et il voudrait ping un website/server/host/ip
, mais il ne peut pas.
Donc je vous conseille de délai d'attente.
Bonne chance!
SLEEP 5
a été inclus dans certaines des trousses de ressources de Windows.
TIMEOUT 5
était inclus dans certains kits de ressources Windows, mais est maintenant une commande standard dans Windows 7 et 8 (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 pendant un certain nombre de secondes.
NETSH badcommand
(Windows XP/Server 2003 Seulement) ou CHOICE
j'essayais de le faire à partir d'une tâche msbuild, et choice et timeout n'ont pas fonctionné à cause de la redirection d'e/s.
j'ai fini par dormir.exe de http://sourceforge.net/projects/unxutils , ce qui est agréable parce qu'il ne nécessite pas d'installation et il est minuscule.
d'Essayer choice
:
<Target Name="TestCmd">
<Exec Command="choice /C YN /D Y /t 5 " />
</Target>
résultats dans:
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.
d'Essayer timeout
:
<Target Name="TestCmd">
<Exec Command="timeout /t 5 " />
</Target>
résultats dans:
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.
mis à part:
j'utilise en fait <Exec Command="sleep 2 & dbghost.exe" />
parce que j'exécute dbghost.exe plusieurs fois en parallèle et il crée des fichiers/bases de données temp basées sur le temps d'époque actuel en secondes - ce qui signifie Bien sûr que si vous démarrez plusieurs instances, chacune utilise le même nom temp. J'ai été à l'origine, j'ai essayé d'utiliser la commande MSBuild Extension Pack Thread.Sleep
, mais il semble que (Habituellement) il exécutait la tâche de sommeil fine, mais alors en commençant la tâche <exec>
dans tous les threads en même temps, et bien sûr dbghost.exe échouerait avec les conflits. Jusqu'à présent, à l'aide de sommeil.exe semble être plus fiable.
deux réponses:
tout D'abord, pour retarder dans un fichier batch, simplement sans toutes les méthodes obtuses que les gens ont proposé:
timeout /t <TimeoutInSeconds> [/nobreak]
http://technet.microsoft.com/en-us/library/cc754891.aspx
deuxièmement, il est important de mentionner que bien qu'il ne fasse pas exactement ce que vous voulez, en utilisant L'outil intégré Windows snipping, vous pouvez déclencher une coupure sans utiliser la souris. Exécuter la capture outil, échapper à la prise de courant, mais laisser l'outil en cours d'exécution, et appuyez sur Contrôle + Imprimer L'écran lorsque vous voulez que la prise de courant se produire. Cela ne devrait pas interférer avec ce que vous essayez de couper.
C'est la dernière version de ce que j'utilise dans la pratique pendant une pause de dix secondes pour voir la sortie quand 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 fait me permet de voir quand le script terminé et le ping fournit le retard. Les signes "extra" signifient que je vois le texte" fait " et l'attente se produit sans que je sois distrait par leurs commandes.
j'ai essayé les différentes solutions données ici sur une machine XP, puisque l'idée était pour avoir un fichier batch qui fonctionnerait sur une variété de machines, et donc j'ai 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 a semblé 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 à environ une seconde d'intervalle, faisant 4 secondes. Et chaque tentative de ping probablement a duré environ une seconde, soit un total estimé à 9 secondes.
BAD> timeout 5
BAD> sleep /w2000
BAD> waitfor /T 180
BAD> choice
Les commandes ne sont pas disponibles.
BAD> ping 192.0.2.0 -n 1 -w 10000 > nul :: wait 10000 milliseconds, ie 10 secs
j'ai essayé aussi ci-dessus, après avoir lu que des commentaires pouvaient être ajoutés aux Fichiers BAT en utilisant deux colonnes consécutives. Cependant, le logiciel est revenu presque instantanément. Mettre le commentaire sur sa propre ligne avant le ping a bien fonctionné.
GOOD> :: wait 10000 milliseconds, ie 10 secs
GOOD> ping 192.0.2.0 -n 1 -w 10000 > nul
pour mieux comprendre ce que fait ping dans la 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 chacune d'une durée de 5 secondes, mais il y a environ un délai d'une seconde entre les tentatives de ping: il y a après tout peu de raison de s'attendre à un résultat différent si vous ping à nouveau immédiatement et il est préférable de donner à un réseau un peu de temps pour se remettre de quelque problème qu'il a eu.
Edit: volé un autre post , .. RFC 3330 dit l'adresse IP 192.0.2.0 ne doit pas apparaître sur l'internet, donc pinging cette adresse empêche ces tests spamming n'importe qui! J'ai modifié le texte ci-dessus en conséquence!
j'ai fait ça. Il fonctionne et montre le temps laissé en quelques secondes. Si vous voulez l'utiliser, ajoutez à un fichier batch:
call wait 10
ça marchait quand je l'ai testé.
Liste de wait.bat
(il doit être 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
deux autres façons qui devraient fonctionner sur TOUT 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
en utilisant" ping " le-n déterminera le temps d'arrêt seulement quand il n'y a pas de réponse au ping. Consultez ce post sur la mise en œuvre de DELAY en tant que fichier batch.
commande de délai mise en œuvre en tant que fichier de lot
je pourrais simplement copier-coller les bits importants, mais l'ensemble du post est très utile.
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
j'utilise la méthode suivante entièrement basée sur les capacités de Windows XP pour faire un retard dans un fichier de lot:
retard de fichier.MTD
@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 de sorte que la méthode fonctionne également lorsque l'intervalle de retard dépasse minuit.
la façon la plus facile de le faire était celle-ci:
Téléchargez le sommeil.exe à http://www.sleepcmd.com / . Le. exe fichier doit être dans le même dossier que le programme que vous avez écrit!
cela peut être fait avec deux lignes simples dans un fichier batch: écrire un fichier .vbs
temporaire dans le dossier %temp%
et l'appeler:
echo WScript.Sleep(5000) >"%temp%\sleep.vbs"
cscript "%temp%\sleep.vbs"
si vous avez une version appropriée de Windows et le Windows Server 2003 Resource Kit Tools , il inclut une commande de veille pour les programmes par lots. Pour en savoir plus: http://malektips.com/xp_dos_0002.html
PING -n 60 127.0.0.1>nul
dans le cas où votre adaptateur LAN n'est pas disponible.
faites 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 sommeil.cmd à c:\windows\system32
Utilisation:
sleep 500
dort pendant 0,5 seconde. Arguments dans ms. Une fois copié sur System32, il peut être utilisé partout.
éditer: vous devriez également être loin que si la machine n'est pas connecté à un réseau (disons un portable que votre utilisation dans le métro), le tour de ping ne fonctionne plus vraiment.
Eh bien cela fonctionne si vous avez le choix ou 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
dis-moi juste s'il dort.cmd ou sommeil.chauve-souris et l'exécuter
ping attend environ 5 secondes avant de chronométrer, pas 1 seconde comme indiqué ci-dessus. C'est-à-dire, à moins que vous dire il à attendre seulement 1 seconde avant de chronométrer.
ping 1.0.0.1-n 1-w 1000
va ping une fois, attendre seulement 1 seconde (1000 ms) pour une réponse, puis time out.
donc un approximativement délai de 20 secondes serait:
ping 1.0.0.1-n 20-w 1000
j'ai écrit un programme powerbasic attendez.exe , où vous lui passez un paramètre milliseconde dans votre fichier de lots
wait 3000
system('c:/windows/system32/SnippingTool.exe')
le code pour le EXE:
FUNCTION PBMAIN()
c$ = Command$
s! = Val(c$)*1000
Sleep s!
END FUNCTION
sur les nouvelles versions de Windows OS vous pouvez utiliser la commande
sleep /w2000
dans un script DOS ( .cmd
ou .bat
) pour attendre 2s (2000 ms - remplacer le temps dans ms dont vous avez besoin). Faites attention à inclure l'argument /w
- sans lui, tout l'ordinateur est endormi! Vous pouvez utiliser -m
au lieu de /m
si vous le souhaitez et optionnellement deux points (:) entre le w et le nombre.
Cela devrait faire l'affaire: choix / T 5 / N / D Y
remplacez le 5 par le temps en secondes que vous voulez attendre...
je pense que la commande suivante peut aider:
pause 5
La syntaxe de la commande pause est: pause d \ \ où d représente la durée en secondes
J'utilise Windows 7 (32 bits), mais je ne sais pas pour les autres.