Welcome PowerShell User! This recipe is just one of the hundreds of useful resources contained in the PowerShell Cookbook.
If you own the book already, login here to get free, online, searchable access to the entire book's content.
If not, the Windows PowerShell Cookbook is available at Amazon, or any of your other favourite book retailers. If you want to see what the PowerShell Cookbook has to offer, enjoy this free 90 page e-book sample: "The Windows PowerShell Interactive Shell".
You want to pause or delay your script or command.
To pause until the user presses the Enter key, use the pause
command:
PS > pause Press Enter to continue...:
To pause until the user presses any key, use the ReadKey()
method on the $host
object:
PS > $host.UI.RawUI.ReadKey()
To pause a script for a given amount of time, use the Start-Sleep
cmdlet:
PS > Start-Sleep 5 PS > Start-Sleep -Milliseconds 300
When you want to pause your script until the user presses a key or for a set amount of time, pause
and Start-Sleep
are the two cmdlets you’re most likely to use.
If you want to retrieve user input rather than just pause, the Read-Host
cmdlet lets you read input from the user. For more information, see Recipe 13.1.
In other situations, you may sometimes want to write a loop in your script that runs at a constant speed—such as once per minute or 30 times per second. That is typically a difficult task, as the commands in the loop might take up a significant amount of time, or even an inconsistent amount of time.
In the past, many computer games suffered from solving this problem incorrectly. To control their game speed, game developers added commands to slow down their game. For example, after much tweaking and fiddling, the developers might realize that the game plays correctly on a typical machine if they make the computer count to 1 million every time it updates the screen. Unfortunately, the speed of these commands (such as counting) depends heavily on the speed of the computer. Since a fast computer can count to 1 million much more quickly than a slow computer, the game ends up running much more quickly (often to the point of incomprehensibility) on faster computers!
To make your loop run at a regular speed, you can measure how long the commands in a loop take to complete, and then delay for whatever time is left, as shown in Example 4-1.
$loopDelayMilliseconds
=
650
while
(
$true
)
{
$startTime
=
Get-Date
## Do commands here
"Executing"
$endTime
=
Get-Date
$loopLength
=
(
$endTime
-
$startTime
).
TotalMilliseconds
$timeRemaining
=
$loopDelayMilliseconds
-
$loopLength
if
(
$timeRemaining
-gt
0
)
{
Start-Sleep
-Milliseconds
$timeRemaining
}
}
For more information about the Start-Sleep
cmdlet, type Get-Help Start-Sleep
.
Recipe 13.1, “Read a Line of User Input”