Я думаю, що варто чітко переглядати / узагальнювати вибір тут, а потім запропонувати новий варіант, який, на мою думку, забезпечує найкращу корисність.
<1> ReadKey (System.Console)
write-host "Press any key to continue..."
[void][System.Console]::ReadKey($true)
- Перевага: приймає будь-яку клавішу, але належним чином виключає клавіші модифікаторів Shift, Alt, Ctrl.
- Недолік: не працює в PS-ISE.
<2> ReadKey (RawUI)
Write-Host "Press any key to continue ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
- Недолік: не працює в PS-ISE.
- Недолік: не виключає модифікаційних клавіш.
<3> смд
cmd /c Pause | Out-Null
- Недолік: не працює в PS-ISE.
- Недолік: при першому використанні помітно запускається нова оболонка / вікно; не помітний при подальшому використанні, але все ж має накладні витрати
<4> Читання-хост
Read-Host -Prompt "Press Enter to continue"
- Перевага: працює в PS-ISE.
- Недолік: приймає лише клавішу Enter.
<5> Композит ReadKey
Це композиція <1> вище із вирішенням / хитрістю ISE, витягнутим із пропозиції в технічному блозі Адама (ласкаво про Ніка з попередніх коментарів на цій сторінці). Я зробив два незначні вдосконалення останнього: додав Test-Path, щоб уникнути помилки, якщо ви використовуєте Set-StrictMode (так, чи не так ?!) та остаточний Write-Host, щоб додати новий рядок після натискання клавіші, щоб поставити підкаже в потрібному місці.
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
}
}
- Перевага: приймає будь-яку клавішу, але належним чином виключає клавіші модифікаторів Shift, Alt, Ctrl.
- Перевага: працює в PS-ISE (хоча тільки за допомогою клавіші Enter або клацання миші)
- Недолік: Не однолінійний!