Powershell等待指定的键被按下,否则超时

时间:2018-01-15 10:43:19

标签: powershell timeout

我想让用户在5秒内输入指定的密钥(例如:$)。 如果用户无法输入指定的密钥,则会超时。

$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")  

此方法允许用户输入密钥,但控制台将继续等待输入,这不是超时。如何实现?

1 个答案:

答案 0 :(得分:0)

您需要在while循环中检查[Console]::KeyAvailable并手动超时。

function Read-KeyWithTimeout {
    param([int] $Timeout = 1000)
    end {
        $stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
        while (-not [Console]::KeyAvailable) {
            if ($stopwatch.ElapsedMilliseconds -gt $Timeout) {
                throw 'Timeout hit'
            }

            Start-Sleep -Milliseconds 50
        }

        $Host.UI.RawUI.ReadKey('NoEcho, IncludeKeyDown')
    }
}

[Console]::KeyAvailable返回true时,缓冲区中的输入等待读取。

注意:在Unix上,由于System.Console的实现方式,仍然会回显输入