我想让用户在5秒内输入指定的密钥(例如:$)。 如果用户无法输入指定的密钥,则会超时。
$host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
此方法允许用户输入密钥,但控制台将继续等待输入,这不是超时。如何实现?
答案 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
的实现方式,仍然会回显输入。