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