Table of Contents
Solutions for PowerShell Integrated Scripting Environment(ISE) and Command Line Console
Using Read-Host
Cmdlet
Use the Read-Host
command to enable press any key to continue
in PowerShell.
1 2 3 |
Read-Host -Prompt "Press any key to continue..." |
1 2 3 4 |
Press any key to continue...: pressed pressed |
The Read-Host
cmdlet is the most commonly used and easy to understand. We used it to pause execution and prompt the user to get the input line from the PowerShell console. Remember, we must press Enter to exit from the pause mode.
Here, the -Prompt
parameter was used to specify a prompt’s text, allowing the user to type a string. If the string contains spaces, then enclose it within the quotation marks.
We can also use the Read-Host
cmdlet to prompt users to get secure data, for instance, passwords, because we can save the received input string as a secure string using the -AsSecureString
parameter as follows:
1 2 3 |
Read-Host "Enter a Password" -AsSecureString |
1 2 3 |
Enter a Password: **** |
Remember, the Read-Host
can only accept 1022
characters as the input given by the user.
Using Message Box UI
This approach is practical when we want to enable only one key to continue in PowerShell. So, to allow that:
- Use
New-Object
with the-ComObject
parameter to specify theCOM
object’s programmatic identifier. - Use the
.Popup()
function to display text in a pop-up window.
1 2 3 4 |
$Shell = New-Object -ComObject "WScript.Shell" $Button = $Shell.Popup("Press OK to continue.", 0, "Hi", 0) |
We can use the New-Object
cmdlet to create an instance of a COM
object or .NET framework. We can write either the ProgID
of the COM
Object or the type of a .NET framework class.
For the above code fence, we used New-Object
to create an instance of the COM
object. Then, we specified the -ComObject
parameter with the New-Object
cmdlet to write the programmatic identifier (ProgID
) of the COM
object, which was the WScript.shell
and saved the reference in $Shell
variable.
Next, we used the Popup()
method to show text in the pop-up message box. We can only use the Popup()
method by chaining it with the WshShell
Object, which is $Shell
in our case. The .Popup()
method took four values; let’s understand them below:
strText
– Contains a string type value, which is the text message displayed in our pop-up message box. We usedPress OK to continue
as the value for thestrText
parameter.nSecondsToWait
– It is an optional parameter that contains a numeric value denoting the maximum time (in seconds) to display a pop-up message box. If this parameter is set to0
, which is its default value, the message box will be visible until the user pressesOK
orX
. The message box will also be closed if users hit Enter from their keyboard.strTitle
– It also holds a string type value, used as the title for the pop-up message box.nType
– An optional parameter that holds a numeric value representing the type of icons/buttons we want to use in our pop-up message box. For instance, we used0
to show theOK
button. You can find different decimal values for different types of controls (buttons) and icons here.
Finally, we used $Button
to hold a numerical value, which is returned by the .Popup()
method. This numerical value denotes the number of buttons the user clicks to dismiss the pop-up message box.
Note: We can also specify Hexa-decimal values for the nType
parameter.
Until this point, we have learned various approaches that works in PS-ISE (PowerShell Integrated Scripting Environment), a graphical user interface and front-end hosting. However, below are a few ways that will only work on PowerShell Command Line Console.
Solutions for PowerShell Command Line Console
Using ReadKey()
Method with/without [void]
Use the ReadKey()
method to enable press any key to continue
in PowerShell.
1 2 3 |
[void][System.Console]::ReadKey($true) |
The above command waits until the user press any key to continue. Note that this command will not accept the individual modifier keys (Alt, Ctrl, and Shift).
Let’s break down this command into parts to learn it more clearly. First, the ReadKey($true)
wait, which means blocked on a thread issuing a ReadKey
method, and got the function or character key pressed by a user.
Here, the function or character key can be single or in combination with modifier keys (Alt, Ctrl, and Shift). However, if you press any modifier key only, it will not result in the ReadKey method return.
We passed the $true
argument to the ReadKey()
method because we did not want to display the pressed key in the console window. But this is optional; we can omit this argument or pass $false
if we’re going to show the pressed key in your console window. See the following example.
1 2 3 |
[void][System.Console]::ReadKey($false) |
1 2 3 |
[void][System.Console]::ReadKey() |
We used the static member operator (::
) to call a .NET framework’s static class named System.Console
. We can also use the ::
operator to call static properties of the .NET framework. Now, what is System.Console
?
In the .NET framework, we have a class named Console
, located in the System
namespace. The System.Console
class lets us programmatically access stdin, stderr and stdout in the console application. Here, stdin
, stderr
, and stdout
represents input, error and output streams for the console application.
Now, the question is, why are we using [void]
? Before answering this question, use the following command without [void]
and see its output.
1 2 3 |
[System.Console]::ReadKey($true) |
1 2 3 4 5 |
KeyChar Key Modifiers ------- --- --------- 5 NumPad5 0 |
See, we are getting the information about the pressed key. Now, try to recall where we learned that the $true
argument is passed to the ReadKey()
method when we don’t want to display the data about the pressed key on the console, but the above example behaves entirely in a different way; why?
It is because any expression or command that outputs or returns some data is implicitly displayed to the output stream (also called success stream), which goes to the host by default, a terminal (console window) in which the PowerShell session runs.
We must suppress it if we do not want to output that data. To suppress, we have various options, which include ... | Out-Null
, ... > $null
, [void] (...)
, and $null = ...
. So, we used [void]
to suppress the data returned by [System.Console]::ReadKey($true)
. Note that the [void]
represents the intent to suppress an output upfront.
Now, think of a situation where we have to display the pressed key and relevant data, which is stored in the form of an System.ConsoleKeyInfo object. In that case, we use the following command.
1 2 3 |
[Console]::ReadKey() |
1 2 3 4 5 6 |
g KeyChar Key Modifiers ------- --- --------- g G 0 |
Using RawUI.ReadKey()
Method
To enable press any key to continue
in PowerShell:
- Use
Write-Host
to write a user-friendly message. - Use
RawUI.ReadKey()
to read the keystroke from the keyboard device.
1 2 3 4 |
Write-Host -NoNewLine 'Press any key to continue...'; $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'); |
1 2 3 4 5 6 |
Press any key to continue... VirtualKeyCode Character ControlKeyState KeyDown -------------- --------- --------------- ------- 104 8 NumLockOn True |
Here, we used the Write-Host
cmdlet to display a user-friendly message on the PowerShell console and to guide the user about what s/he is supposed to do.
Next, we used the -NoNewLine
parameter to concatenate the input object to form an output. No newlines or spaces will be inserted between the output strings. Likewise, no new line will be added after the last output string.
After that, we used the $Host.UI.RawUI.ReadKey()
method, which is similar to the [Console]::ReadKey()
that we learned in the previous section. It can accept any key, even modifier keys, which includes Ctrl, Shift, Alt, and other modifier keys.
Note that we can use RawUI.ReadKey()
with and without ReadKeyOptions, which includes IncludeKeyDown
, IncludeKeyUp
, NoEcho
, and AllowCtrlC
. So, for the above code example, we used ReadKey()
with ReadKeyOptions
and got data as an output which is saved in the form of KeyInfo object.
If you are interested in more technical details, let me tell you that the $Host.UI
is a System.Management.Automation.Internal.Host.InternalHostRawUserInterface
object. In contrast, the $Host
is an automatic variable whose type is System.Management.Automation.Internal.Host.InternalHost
. Therefore, we can use the $Host.GetType().FullName
command to know the type of the $Host
variable.
Using cmd /c pause
Command
Use the cmd /c pause
command to enable press any key to continue
in PowerShell.
1 2 3 |
cmd /c pause |
1 2 3 |
Press any key to Continue |
The above command enabled and displayed Press any key to continue ...
and wait for the user to press any key. It returns once the user presses any key, excluding modifier keys.
Using timeout /t
Command
Use the timeout /t
command to enable press any key to continue
and wait for the specified number of seconds or user’s input in PowerShell.
1 2 3 |
timeout /t 10 |
1 2 3 |
Waiting for 10 seconds, press a key to continue ... |
The above timeout
command paused the execution for a time frame or infinite time. Here, we used /t
to specify the time in seconds. Note that the given time must be from the -1
to 99999
range. So, for example, the above command will wait for 10
seconds if no key is pressed.
We can use the following command to keep waiting for an infinite time until the user presses any key excluding Fn, Ctrl, and Alt, etc.
1 2 3 |
timeout /t -1 |
That’s all about how to press any key to continue in PowerShell.