如何防止Powershell脚本读取意外的输入

时间:2019-06-24 23:56:24

标签: powershell

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()调用之间的脚本执行过程中进行的第一次击键,循环,然后输出第二次击键,依此类推。击键用尽后,它将坐下来,等待输入像预期的那样。

1 个答案:

答案 0 :(得分:0)

您应该考虑使用以下内容代替[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中不起作用,但是如果您使用的是控制台,它将可以正常工作。