Ответ 1
Нашел что-то здесь:
$counter = 0
while(!$Host.UI.RawUI.KeyAvailable -and ($counter++ -lt 600))
{
[Threading.Thread]::Sleep( 1000 )
}
Я искал, но, по-видимому, мой google foo слаб. Мне нужен способ запроса пользователя на консоль и время ожидания запроса через некоторое время и продолжить выполнение script, если вход не поступает. Насколько я могу судить, Read-Host не предоставить эту функциональность. Также нет $host.UI.PromptForChoice() и не $host.UI.RawUI.ReadKey(). Спасибо заранее за любые указатели.
EDIT: Большое спасибо Ларсу Труйенсу за то, что он нашел ответ. Я взял код, который он указал, и инкапсулировал его в функцию. Обратите внимание, что способ, которым я его реализовал, означает, что может быть до одной секунды задержки между тем, когда пользователь нажимает клавишу, и когда выполнение script продолжается.
function Pause-Host
{
param(
$Delay = 1
)
$counter = 0;
While(!$host.UI.RawUI.KeyAvailable -and ($counter++ -lt $Delay))
{
[Threading.Thread]::Sleep(1000)
}
}
Нашел что-то здесь:
$counter = 0
while(!$Host.UI.RawUI.KeyAvailable -and ($counter++ -lt 600))
{
[Threading.Thread]::Sleep( 1000 )
}
Теперь он довольно старый, но как я решил его на основе того же метода KeyAvailable:
https://gist.github.com/nathanchere/704920a4a43f06f4f0d2
Он ожидает x секунд, отображая .
для каждой секунды, которая истекает до максимального времени ожидания. Если нажата клавиша, она возвращает $true
, иначе $false
.
Function TimedPrompt($prompt,$secondsToWait){
Write-Host -NoNewline $prompt
$secondsCounter = 0
$subCounter = 0
While ( (!$host.ui.rawui.KeyAvailable) -and ($count -lt $secondsToWait) ){
start-sleep -m 10
$subCounter = $subCounter + 10
if($subCounter -eq 1000)
{
$secondsCounter++
$subCounter = 0
Write-Host -NoNewline "."
}
If ($secondsCounter -eq $secondsToWait) {
Write-Host "`r`n"
return $false;
}
}
Write-Host "`r`n"
return $true;
}
И использовать:
$val = TimedPrompt "Press key to cancel restore; will begin in 3 seconds" 3
Write-Host $val