Я думаю, что для ясности стоит резюмировать / обобщить варианты здесь, а затем предложить новый вариант, который, я считаю, обеспечивает лучшую полезность.
<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
cmd /c Pause | Out-Null
- Недостаток: не работает в PS-ISE.
- Недостаток: заметно запускает новую оболочку / окно при первом использовании;не заметно при последующем использовании, но все еще имеет накладные расходы
<4> Read-Host
Read-Host -Prompt "Press Enter to continue"
- Преимущество: Работает в PS-ISE.
- Недостаток: принимает только клавишу ввода.
<5> Компоновка ReadKey
Это составная часть из <1> выше с обходным приемом ISE / kludge, извлеченным из предложения на Технический блог Адама (любезно предоставлено Ником из предыдущих комментариев на этой странице).Я сделал два небольших улучшения в последнем: добавлен 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 или щелчком мыши)
- Недостаток: не однострочник!