等待超时的用户输入

EBG*_*een 19 powershell

我搜索过,但显然我的谷歌foo很弱.我需要的是一种在控制台中提示用户输入并在一段时间后请求超时并在没有输入的情况下继续执行脚本的方法.尽管我已经知道,Read-Host不提供这个功能.$ host.UI.PromptForChoice()也不是$ host.UI.RawUI.ReadKey().提前感谢任何指针.

编辑:非常感谢Lars Truijens找到答案.我已经采用了他指出的代码并将其封装到一个函数中.请注意,我实现它的方式意味着在用户点击密钥和脚本执行继续之间可能存在长达一秒的延迟.

function Pause-Host
{
    param(
            $Delay = 1
         )
    $counter = 0;
    While(!$host.UI.RawUI.KeyAvailable -and ($counter++ -lt $Delay))
    {
        [Threading.Thread]::Sleep(1000)
    }
}
Run Code Online (Sandbox Code Playgroud)

Lar*_*ens 16

发现了一些在这里:

$counter = 0
while(!$Host.UI.RawUI.KeyAvailable -and ($counter++ -lt 600))
{
      [Threading.Thread]::Sleep( 1000 )
}
Run Code Online (Sandbox Code Playgroud)

  • 在PowerShell 2中还有"Start-Sleep"cmdlet. (5认同)
  • 非常感谢你.我在你强大的谷歌福之前鞠躬. (2认同)

nat*_*ere 5

它现在已经很老了,但我是如何基于相同的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;
}
Run Code Online (Sandbox Code Playgroud)

并使用:

$val = TimedPrompt "Press key to cancel restore; will begin in 3 seconds" 3
Write-Host $val
Run Code Online (Sandbox Code Playgroud)

  • 上述问题是任何按键都不会被"吞噬".要吞下它,你可以在最终返回之前放入以下内容:`$ host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")` (2认同)