Context: This morning I was standing with Ben Gelens at the coffee machine since we’re both at the same customer.
Problem: Someone walked by and asked me if there is a way for PowerShell to ask for a key to press before it continues with the script… like a pause.
Together we replied: Read-Host. However, it seems that this scripter didn’t want a pop-up… which is what Read-Host gives… in PowerShell v2 at least.
In PowerShell 5 (which is what I’ve tested) it does not provide a pop-up. It also isn’t exactly like Press Any Key To Continue since it will only continue after an ENTER.
Solution: Upgrade to the latest and greatest version of Windows (or just upgrade WMF/PowerShell).
Workaround: See below.
Inside a PowerShell prompt you can do the following:
1 |
[void][System.Console]::ReadKey($true) |
This is maybe a bit much for beginning scripters, so here’s an simpler version:
1 |
[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')) |
However, if you were to execute this in PowerShell ISE, you’ll get hit by an error:
1 2 3 4 5 6 |
Exception calling "ReadKey" with "1" argument(s): "The method or operation is not implemented." At line:1 char:1 + $Host.UI.RawUI.ReadKey( [System.Management.Automation.Host.ReadKeyOpt ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : NotSpecified: (:) [], MethodInvocationException + FullyQualifiedErrorId : NotImplementedException |
It seems that the ReadKey method isn’t implemented in the host of Windows PowerShell ISE…
So here’s some code that will offer a bit like the same functionality but in ISE (instead of any key, only ENTER will work):
1 |
[void](Read-Host 'Press Enter to continue…') |
Yes, Read-Host.
All my endeavours and investigations have led me to one single conclusion: Within Windows PowerShell ISE there is only one way to get functionality that resembles the Press Any Key To Continue behaviour and that is by using Read-Host.
This is because the console in ISE isn’t a console. It resembles one, but it isn’t the PowerShell console.
I don’t know if the terminology is correct, but I think it’s something that emulates a PowerShell console 🙂
Hope you find this information useful.
quick and easy Pause function, load it in your profile to have it available in the console:
Function Pause {
Param([string]$Message=”Press any key to continue…, [switch]$LeaveMessage, [switch]$returnKey)
#get cursor position so we can move it back later
$pos = $host.UI.RawUI.cursorPosition;
#flush the input buffer before pausing to clear any extraneous keypresses
$host.UI.RawUI.FlushInputBuffer()
write-host -NoNewLine:$(!$LeaveMessage) $Message
#save the key pressed in case we need it
$key = $host.UI.RawUI.ReadKey(“NoEcho, IncludeKeyUp”)
# when a key is pressed and we continue, do we continue on the next line or remove the message
if(!LeaveMessage) {
#overwrite the message with empty space
$host.UI.RawUI.CursorPosition = $pos
write-host -NoNewLine (” ” *$Message.length)
#set the cursor back to where is started
$host.UI.RawUI.CursorPosition = $pos
}
#return the key if needed
if ($returnkey) [ return $key }
}
Examples:
Pause
Pause -Message “Press something”
Pause -LeaveMessage -returnkey
Maybe a little overdone for this particular function but in general you can overcome the IDE error by using the Start-Process cmdlet (and wait till it is finished):
Start-Process PowerShell {[void][System.Console]::ReadKey($true)} -wait