Creo que vale la pena recapitular / resumir las opciones aquí para mayor claridad ... luego ofrecer una nueva variación que creo que proporciona la mejor utilidad.
<1> ReadKey (System.Console)
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
- Ventaja: Acepta cualquier tecla pero excluye correctamente las teclas modificadoras Shift, Alt, Ctrl.
- Desventaja: no funciona en PS-ISE.
<2> ReadKey (RawUI)
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
- Desventaja: no funciona en PS-ISE.
- Desventaja: no excluye las teclas modificadoras.
<3> cmd
cmd /c Pause | Out-Null
- Desventaja: no funciona en PS-ISE.
- Desventaja: Lanza visiblemente un nuevo shell / ventana en el primer uso; no se nota en el uso posterior pero todavía tiene la sobrecarga
<4> Host de lectura
Read-Host -Prompt "Press Enter to continue"
- Ventaja: Funciona en PS-ISE.
- Desventaja: solo acepta la tecla Intro.
<5> Compuesto ReadKey
Esta es una combinación de <1> anterior con la solución ISE / kludge extraída de la propuesta en el blog tecnológico de Adam (cortesía de Nick de comentarios anteriores en esta página). Hice dos ligeras mejoras en este último: agregué Test-Path para evitar un error si usa Set-StrictMode (lo hace, ¿no?) Y el Write-Host final para agregar una nueva línea después de presionar la tecla para poner el mensaje en el lugar correcto.
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
}
}
- Ventaja: Acepta cualquier tecla pero excluye correctamente las teclas modificadoras Shift, Alt, Ctrl.
- Ventaja: funciona en PS-ISE (aunque solo con Enter o clic del mouse)
- Desventaja: ¡No es de una sola línea!