How to sleep or wait in Windows batch file ?


👤 Diwas Poudel    🕒 20 Feb 2023    📁 TECH

The Sleep/Wait Command is a very useful command that is used to pause for a set amount of time while a batch script is being executed. To put it another way, this command makes it easier to run a command for a set amount of time.

You may find yourself in a situation where you want to run a series of command lines one after the other, but with a time delay between them. In this case, the sleep command will come in handy. This article will show you how to use the sleep command in Windows batch scripts.

Sleep and wait
fig. Sleep and wait
📚 Note: Windows does not have a direct Sleep command as provided in Linux, we must use a different method to achieve the same result. Furthermore, no root privileges are required to implement in a batch script.

1 Using timeout to achieve sleep function

timeout is an old Windows command introduced in Windows 2000 that is used to add a delay between two tasks.

Usage :

timeout /t [/nobreak]

Here,

/t  Specify the number of seconds to wait (between -1 and 99999) before the command processor continues processing. When you enter the value -1, the computer will wait indefinitely for a keystroke. Also, a number of seconds in a nonwhole number like 1.5 is not accepted.
/nobreak Specifies to ignore user keystrokes. But accepts CTRL + C strokes which directly terminate the batch.
/? Displays help at the command prompt.
timeout-help
fig. timeout help

 

Example1: Basic timeout in Batch Script

@echo off
echo First Task Here ...
echo Approximately 10-second delay
timeout /t 10 
echo Second Task Here ...
pause

We have two tasks here, and we have inserted a timeout script that waits for 10 seconds for the First Task to complete before starting the Second Task.

In details:

"@echo off" disables the console window command display in this Windows batch file script. After this line, console commands will not be displayed.

The terminal window will display "echo First Task Here" after the next line. Displays the provided text in the console window.

"echo About 10-second delay" informs the user of a delay in the console window.

"Timeout /t 10" will postpone script execution for 10 seconds. The console window will countdown the remaining time.

"echo Second Task Here..." will appear in the terminal window after the wait, restarting script execution.

Lastly, the "pause" command pauses script execution and displays "Press any key to resume...", allowing the user to inspect the console window output before closing it. After "pause," the script must be resumed by pressing any key.

Drawback: This will show unnecessary "Waiting for 0 seconds, press a key to continue..." and when you press any key it will continue to the next task. It is a good way of letting the user know the safe escape route to skip sleep.

Example2: Timeout with only CTRL + C key to Skip

@echo off
 .....
timeout /t 10 /nobreak
.....
pause

Here, /nobreak does not allow to break or skip sleep with any key. But pressing the CTRL + C key combination will force to close the batch processing and close the program immediately.

Also read: Run multiple commands in one line in Powershell and Cmd

Example 3: Sleep without timeout message

@echo off
....
timeout /t 15 /nobreak > nul
....
pause

Appending >nul part so that the command does not display output anything to the screen. It suppresses the countdown time.

Another best use case of the timeout is as follows:

calc && timeout 5 && notepad

This will open the calculator, then wait 5 seconds before opening the notepad. Remember to include and && between each block. You can continue to cascade it like shown below

calc && timeout 3 && notepad && timeout 4 && regedit

This will open the calculator, then wait 3 seconds for the notepad to open, then wait 4 seconds for the registry editor to open.

Note that: Ctrl + C will break the whole program.

Drawbacks of TIMEOUT 

Here are some drawbacks of timeout :

  • Cannot perform delay in a fraction of a second. ie. like timeout /t 0.5 does not work. And will give
    an error message stating "Error: Invalid value for timeout (/T) specified. The valid range is -1 to 99999)
  • Cannot use a second value greater than 99999

2 Using Ping to Delay to achieve sleep function

@echo off
.....
ping localhost -n 10 > nul
.....
pause

Ping is actually used to determine whether or not a resource responds to a request. Ping sends a request to the resource and waits one second for a response. As a result, it is useful to use it as a delay function. Even if it waits for one second, it may receive a response in a few milliseconds. However, as soon as you ping the last packet here in the tenth request, it will automatically stop.

Also read: How to list all environment variables?

The resource we are pinging here is localhost, which is a local loopback, and it responds instantly within a millisecond but must wait 1 second each. And here in the example, we are waiting for nearly 10 seconds before executing the next line.

Note that: Ctrl + C will break the delay.

3 Using Ping to Delay with nonexisting IP

@echo off
....
ping 192.4.4.4 -n 1 -w 10000 > nul
....
pause

Here waiting for 10 seconds. Here we must ping a non-existing IP address and if it exists it will not work. -w indicates waiting and here it waits for 10000 ms, you can change this value. And by default ping will request 4 times to the resource. Here, -n 1 indicates request only 1 time.

4 Using Ping to Delay in less than 1 second.

Just replace 10000ms with anything smaller than 1000ms. like 500ms as shown below

ping 192.4.4.4 -n 1 -w 500 > nul

5 Using Powershell in Command to delay 

Simply follow the simple example below if you want to use Powershell commands from the command line:

Example 1

powershell -command "Please Wait for 5 second" -s 5

type this command in the command line or batch file. This command will hold the screen for 5 seconds. You can change it from 5 to any number. This can be useful if a Windows command fails or has an issue.

Example 2:

powershell -nop -c "& {sleep -m 5}"

6 Using Powershell in Sleep Start Command to delay 

Alternatively, you can sleep-start command of Powershell in CMD as below:

powershell -ExecutionPolicy Bypass -Command "Start-Sleep -Seconds 5"

The above command will wait for 5 seconds. Note that: Method 5 is a short form of method 6

powershell -ExecutionPolicy Bypass -Command "Start-Sleep -MilliSeconds 500"

The above command will wait for 500 milliseconds.

7 Using the Mshta command

Mshta.exe is a native Windows binary that was developed specifically for the purpose of executing Microsoft HTML Application (HTA) files.Mshta is able to run code written in Windows Script Host (VBScript and JScript) that is embedded into HTML in a manner that is aware of network proxies.

start "" /w /b /min mshta "javascript:setTimeout(function(){close();},5000);"

Conclusion:

To summarize, in Windows batch files, you can pause the execution of the batch file for a specified number of seconds by using the "sleep" command, and you can create a custom "wait" command by using the "timeout" command. Both of these commands can be found in the "commands" section of the batch file. While the "wait" command can be used to wait for a defined number of seconds before continuing with the next command, the "sleep" command is used to pause the execution of the batch file for a specified number of seconds at a time. You will be able to regulate the timing and flow of your batch file by using these commands, which will enable you to ensure that it runs smoothly and effectively.

FAQ:

What is the WaitFor command?

Waitfor.exe is a small utility that is included with Windows 7 and later versions. This program is designed to listen for and respond to a named signal. Visit here for more info.

Is there a command in Windows that allows you to sleep and wait?

There is no sleep and wait-for command in the windows version. The best alternative is the Timeout command as explained above. In Linux, you can simply use: sleep n in the terminal where n is time in seconds.

How to sleep for five seconds in a batch file?

A simple way to do this in a batch file before and after the task you want to sleep or hold is as follows:

timeout /t 5 /nobreak >nul