Jeff Wouters's Blog

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:

[void][System.Console]::ReadKey($true)

This is maybe a bit much for beginning scripters, so here’s an simpler version:

[void]($Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown'))

However, if you were to execute this in PowerShell ISE, you’ll get hit by an error:

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):

[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.

Leave a Comment more...

While working on my TrellOps module, one of the things I needed was a way to teach people the Fibonacci sequence.
So whenever in doubt, I told them to use this little function 🙂

function Get-Fibonacci ([int32]$m) {
    $c,$p = 1
    while ($c -le $m) {
        $c
        $c,$p = ($c + $p),$c
    }
}
Get-Fibonacci 50
Leave a Comment more...