Acho que vale a pena recapitular / resumir as opções aqui para maior clareza ... e então oferecer uma nova variação que acredito fornecer a melhor utilidade.
<1> ReadKey (System.Console)
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
- Vantagem: aceita qualquer tecla, mas exclui adequadamente as teclas modificadoras Shift, Alt, Ctrl.
- Desvantagem: Não funciona no PS-ISE.
<2> ReadKey (RawUI)
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
- Desvantagem: Não funciona no PS-ISE.
- Desvantagem: Não exclui teclas modificadoras.
<3> cmd
cmd /c Pause | Out-Null
- Desvantagem: Não funciona no PS-ISE.
- Desvantagem: Visivelmente abre um novo shell / janela na primeira utilização; não perceptível no uso subsequente, mas ainda tem a sobrecarga
<4> Read-Host
Read-Host -Prompt "Press Enter to continue"
- Vantagem: Funciona em PS-ISE.
- Desvantagem: Aceita apenas a tecla Enter.
<5> Composto ReadKey
Este é um composto de <1> acima com a solução alternativa / kludge do ISE extraída da proposta no Blog de Tecnologia de Adam (cortesia de Nick em comentários anteriores nesta página). Fiz duas pequenas melhorias no último: adicionei Test-Path para evitar um erro se você usar Set-StrictMode (você usa , não é ?!) e o Write-Host final para adicionar uma nova linha após seu pressionamento de tecla para colocar o prompt no lugar certo.
Function Pause ($Message = "Press any key to continue . . . ") {
if ((Test-Path variable:psISE) -and $psISE) {
$Shell = New-Object -ComObject "WScript.Shell"
$Button = $Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
}
else {
Write-Host -NoNewline $Message
[void][System.Console]::ReadKey($true)
Write-Host
}
}
- Vantagem: aceita qualquer tecla, mas exclui adequadamente as teclas modificadoras Shift, Alt, Ctrl.
- Vantagem: Funciona em PS-ISE (embora apenas com Enter ou clique do mouse)
- Desvantagem: Não é uma linha única!