To make a batch file wait for a number of seconds there are several options available:
Note: | Click a script file name to expand and view its source code; click the file name again, or the expanded source code, to hide the source code again. To view the source code on its own, right-click the file name and choose Open or Open in separate tab or window. |
The most obvious way to pause a batch file is of course the PAUSE
command.
This will stop execution of the batch file until someone presses "any key".
Well, almost any key: Ctrl, Shift, NumLock etc. won't work.
This is fine for interactive use, but sometimes we just want to delay the batch file for a fixed number of seconds, without user interaction.
SLEEP
was included in some of the Windows Resource Kits.
It waits for the specified number of seconds and then exits.
SLEEP 10
will delay execution of the next command by 10 seconds.
There are lots of SLEEP
clones available, including the ones mentioned in the UNIX Ports paragraph at the end of this page.
TIMEOUT
was included in some of the Windows Resource Kits, but is a standard command as of Windows 7.
It waits for the specified number of seconds or a keypress, and then exits.
So, unlike SLEEP
, TIMEOUT
's delay can be "bypassed" by pressing a key.
TIMEOUT 10
or
TIMEOUT /T 10
will delay execution of the next command by 10 seconds, or until a key is pressed, whichever is shorter.
D:\>TIMEOUT /T 10 Waiting for 10 seconds, press a key to continue ...
You may not always want to abort the delay with a simple key press, in which case you can use TIMEOUT
's optional /NOBREAK
switch:
D:\>TIMEOUT /T 10 /NOBREAK Waiting for 10 seconds, press CTRL+C to quit ...
You can still abort the delay, but this requires Ctrl+C instead of just any key, and will raise an ErrorLevel 1.
For any MS-DOS or Windows version with a TCP/IP client, PING
can be used to delay execution for a number of seconds.
PING localhost -n 6 >NUL
will delay execution of the next command for (a little over) 5 seconds seconds (default interval between pings is 1 second, the last ping will add only a minimal number of milliseconds to the delay).
So always specify the number of seconds + 1 for the delay.
The PING
time-out technique is demonstrated in the following examples:
PMSleep.bat for Windows NT
@ECHO OFF
:: Check Windows version
IF NOT "%OS%"=="Windows_NT" GOTO Syntax
:: Check if a valid timeout period is specified
IF "%~1"=="" GOTO Syntax
IF NOT "%~2"=="" GOTO Syntax
ECHO.%*| FINDSTR /R /X /C:"[0-9][0-9]*" >NUL || GOTO Syntax
IF %~1 LSS 1 GOTO Syntax
IF %~1 GTR 3600 GOTO Syntax
:: Use local variable
SETLOCAL
:: Add 1 second for IPv4
SET /A seconds = %1 + 1
:: The actual command: try IPv4 first, if that fails try IPv6
PING -n %seconds% 127.0.0.1 >NUL 2>&1 || PING -n %1 ::1 >NUL 2>&1
:: Done
ENDLOCAL
GOTO:EOF
:Syntax
ECHO.
ECHO PMSleep.bat
ECHO Poor Man's SLEEP utility, Version 3.00 for Windows NT 4 and later.
ECHO Wait for a specified number of seconds.
ECHO.
ECHO Usage: CALL PMSLEEP seconds
ECHO.
ECHO Where: seconds is the number of seconds to wait (1..3600)
ECHO.
ECHO Notes: The script uses PING for the delay, so an IP stack is required.
ECHO The delay time will not be very accurate.
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
IF "%OS%"=="Windows_NT" EXIT /B 1
PMSlpW9x.bat for Windows 95/98
@ECHO OFF
:: Check if a timeout period is specified
IF "%1"=="" GOTO Syntax
:: Filter out slashes, they make the IF command crash
ECHO.%1 | FIND "/" >NUL
IF NOT ERRORLEVEL 1 GOTO Syntax
:: Check for a non-existent IP address
:: Note: this causes a small extra delay!
IF "%NonExist%"=="" SET NonExist=10.255.255.254
PING %NonExist% -n 1 -w 100 | FIND "TTL=" >NUL
IF ERRORLEVEL 1 GOTO Delay
SET NonExist=1.1.1.1
PING %NonExist% -n 1 -w 100 | FIND "TTL=" >NUL
IF NOT ERRORLEVEL 1 GOTO NoNonExist
:Delay
:: Use PING time-outs to create the delay
PING %NonExist% -n 1 -w %1000 >NUL
:: Show online help on errors
IF ERRORLEVEL 1 GOTO Syntax
:: Done
GOTO End
:NoNonExist
ECHO.
ECHO This batch file needs an invalid IP address to function
ECHO correctly.
ECHO Please specify an invalid IP address in an environment
ECHO variable named NonExist and run this batch file again.
:Syntax
ECHO.
ECHO PMSlpW9x.bat
ECHO Poor Man's SLEEP utility, Version 2.10 for Windows 95 / 98
ECHO Wait for a specified number of seconds.
ECHO.
ECHO Written by Rob van der Woude
ECHO http://www.robvanderwoude.com
ECHO Corrected and improved by Todd Renzema and Greg Hassler
ECHO.
ECHO Usage: CALL PMSLPW9X nn
ECHO.
ECHO Where: nn is the number of seconds to wait
ECHO.
ECHO Example: CALL PMSLPW9X 10
ECHO will wait for 10 seconds
ECHO.
ECHO Note: Due to "overhead" the actual delay may
ECHO prove to be up to a second longer
:End
💾 Download the PMSleep sources
NETSH
may seem an unlikely choice to generate delays, but it is actually much like using PING
:
NETSH Diag Ping Loopback
will ping localhost, which takes about 5 seconds — hence a 5 seconds delay.
NETSH
is native in Windows XP Professional and later versions.
Unfortunately however, this trick will only work in Windows XP/Server 2003.
In MS-DOS 6, Windows 9*/ME and NT 4
REM | CHOICE /C:AB /T:A,10 >NUL
will add a 10 seconds delay.
By using REM |
before the CHOICE command, the standard input to CHOICE is blocked, so the only "way out" for CHOICE is the time-out specified by the /T parameter.
This idea was borrowed from Laurence Soucy, I added the /C
parameter to make it language independent (the simpler REM | CHOICE /T:N,10 >NUL
will work in many but not all languages).
The CHOICE
delay technique is demonstrated in the following example, Wait.bat:
@ECHO OFF
IF "%1"=="" GOTO Syntax
ECHO.
ECHO Waiting %1 seconds
ECHO.
REM | CHOICE /C:AB /T:A,%1 > NUL
IF ERRORLEVEL 255 ECHO Invalid parameter
IF ERRORLEVEL 255 GOTO Syntax
GOTO End
:Syntax
ECHO.
ECHO WAIT for a specified number of seconds
ECHO.
ECHO Usage: WAIT n
ECHO.
ECHO Where: n = the number of seconds to wait (1 to 99)
ECHO.
:End
Note: | The line ECHO Invalid parameter ends with an "invisible" BELL character, which is ASCII character 7 (beep) or ^G (Ctrl+G). |
In Windows 10 the REM
trick no longer works, and the default option is no longer specified with the /T
switch, but with a separate /D
switch:
CHOICE /C:AB /D:A /T:10 >NUL
This means that, unlike in DOS, in Windows 10 you can skip the delay by pressing one of the choices specified with the /C
switch.
The CHOICE
delay technique is demonstrated in the following example, Wait.cmd:
@ECHO OFF
IF NOT "%OS%"=="Windows_NT" GOTO Syntax
IF "%~1"=="" GOTO Syntax
ECHO.
ECHO Waiting %~1 seconds
ECHO.
CHOICE /C:AB /D:A /T:%1 > NUL
IF ERRORLEVEL 255 (
ECHO Invalid parameter
GOTO Syntax
)
GOTO:EOF
:Syntax
ECHO.
ECHO WAIT for a specified number of seconds
ECHO.
ECHO Usage: WAIT n
ECHO.
ECHO Where: n = the number of seconds to wait (1 to 99)
ECHO.
EXIT /B 1
💾 Download the Wait.bat and Wait.cmd source code
For longer delay times especially, it would be nice to let the user know what time is left.
That is why I wrote CountDown.exe (in C#): it will count down showing the number of seconds left.
Pressing any key will skip the remainder of the count down, allowing the batch file to continue with the next command.
You may append the counter output to a custom text, like this (@ECHO OFF
required):
@ECHO OFF SET /P \"=Remaining seconds to wait: \" < NUL CountDown.exe 20
💾 Download CountDown.exe and its C# source code
SystemTrayMessage.exe is a program I wrote to display a tooltip message in the system tray's notification area.
By default it starts displaying a tooltip which will be visible for 10 seconds (or any timeout specified), but the program will terminate immediately after starting the tooltip.
The icon will remain in the notification area after the timeout elapsed, until the mouse pointer hovers over it.
By using its optional /W
switch, the program will wait for the timeout to elapse and then hide the icon before terminating.
Display a tooltip message for 60 seconds while continuing immediately:
SystemTrayMessage.exe "Your daily backup has been started" /T:"Backup Time" /V:60 /S:186 REM Insert your backup command here
Display a tooltip message and wait for 60 seconds:
SystemTrayMessage.exe "It is time for your daily backup, please save and close all documents" /T:"Backup Time" /V:60 /S:186 /W REM Insert your backup command here
Or more sophisticated (requires CountDown.exe too):
@ECHO OFF
SET Message=It is time for your daily backup.\nPlease save and close all documents,\nor press any key to skip the backup.
START /B SystemTrayMessage.exe "%Message%" /T:"Backup Time" /V:20 /S:186 /W
ECHO Press any key to skip the backup . . .
SET /P "=Seconds to start of backup: " < NUL
CountDown.exe 20
IF ERRORLEVEL 2 (
ECHO.
ECHO Backup has been skipped . . .
EXIT /B 1
)
SystemTrayMessage.exe "Your daily backup has been started" /T:"Backup Running" /V:20 /S:186
REM Insert your backup command here
💾 Download SystemTrayMessage.exe and its C# source code
In PowerShell you can use Start-Sleep
when you need a time delay.
The delay can be specified either in seconds (default) or in milliseconds.
Start-Sleep -Seconds 10 # wait 10 seconds
Start-Sleep 10 # wait 10 seconds
Start-Sleep -Seconds 2.7 # wait 3 seconds, rounded to integer
Start-Sleep -MilliSeconds 500 # wait half a second
The following batch code uses PowerShell to generate a delay:
@ECHO OFF
REM %1 is the number of seconds for the delay, as specified on the command line
powershell.exe -Command "Start-Sleep -Seconds %1"
Or if you want to allow fractions of seconds:
@ECHO OFF
REM %1 is the number of seconds (fractions allowed) for the delay, as specified on the command line
powershell.exe -Command "Start-Sleep -MilliSeconds ( 1000 * %1 )"
Note that starting PowerShell.exe in a batch file may add an extra second to the specified delay.
Use the SysSleep function whenever you need a time delay in Rexx scripts.
SysSleep is available in OS/2's (native) RexxUtil module and in Patrick McPhee's RegUtil module for 32-bits Windows.
Use the Sleep command for time delays in KiXtart scripts.
Use WScript.Sleep, followed by the delay in milliseconds in VBScript and JScript (unfortunately, this method is not available in HTAs).
The following batch code uses a temporary VBScript file to generate an accurate delay:
Or if you want to allow the user to skip the delay:
@ECHO OFF
REM %1 is the number of seconds for the delay, as specified on the command line
> "%Temp%.\sleep.vbs" ECHO Set wshShell = CreateObject( "WScript.Shell" )
>> "%Temp%.\sleep.vbs" ECHO ret = wshShell.Popup( "Waiting %~1 seconds", %~1, "Please Wait", vbInformation )
>> "%Temp%.\sleep.vbs" ECHO Set wshShell = Nothing
CSCRIPT //NoLogo "%Temp%.\sleep.vbs"
DEL "%Temp%.\sleep.vbs"
Compiled versions of SLEEP are also available in these Unix ports:
page last modified: 2023-09-12; loaded in 0.0068 seconds