Powershell 似乎有一个缓冲区,用于在调用 ReadKey()
方法之前存储不需要的输入,而我需要它不要这样做。有没有办法使缓冲区无效或阻止输入?
我的脚本应该在整个执行过程中的各个点获取输入。它确实接受输入绝对没问题。问题是当我在 ReadKey()
调用之间时,某些键被意外按下。这些键被存储在某种不可见的按键队列中,然后它们都会自动馈送到下一个 ReadKey() 调用,这完全违背了提示用户有意输入的目的,因此也就失效了脚本。
我一直在寻找这个问题的答案,但部分问题是这个问题很难用简短的搜索词来描述!我尝试使用 KeyAvailable() 来防止记录输入,直到脚本准备好提示输入,但 KeyAvailable() 仍然承认击键的不可见缓冲区在代码执行期间创建。我还尝试清除在循环开始时存储击键的变量,但意外的击键仍然会被输入到下一个 ReadKey()
。我提供了代码的模拟版本作为示例
$loop = $true
do {
# Empties any previously stored value in $key.
$key = $null
write-host "Waiting 10 seconds to simulate script running"
# This simulated area is where extra keyboard input is pressed unintentionally (or intentionally for demonstration purposes).
Start-Sleep 10
write-host "Ok, monkeys. Press any key to loop the simulation."
# Wait for input from the user, record keystroke to $key.key.
$key = [console]::ReadKey()
# Report the status of $key.key
write-host "`nKEY ="$key.key
if ($key.key -eq "Enter") {
$loop = $false
}
} while ($loop -eq $true)
不幸的是没有错误消息,因为我怀疑这是 Powershell 开发人员的预期行为(也许不是,idk)。我希望能够运行脚本,并且在脚本处于 ReadKey() 调用等待击键之前不会记录任何输入。相反,此示例输出在 ReadKey()
调用之间的脚本执行期间进行的第一个击键,循环,然后输出第二个击键,依此类推。当击键用尽时,它将像预期一样等待输入。
最佳答案
您应该考虑使用以下内容而不是[console]::readkey()
$HOST.UI.RawUI.Flushinputbuffer()
write-host "Ok, monkeys. Press any key to loop the simulation."
$HOST.UI.RawUI.ReadKey(“NoEcho,IncludeKeyDown”) | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()
这将刷新缓冲区,然后等待按键,并在按下该键后从缓冲区中刷新该键。它在 ISE 中不起作用,但如果您使用控制台,它会正常工作。
关于powershell - 如何防止 Powershell 脚本读取意外的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56745235/