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

如何防止Powershell脚本读取意外输入,powershell,Powershell,Powershell似乎有一个缓冲区,用于在调用ReadKey()方法之前存储不需要的输入,我需要它不要这样做。有没有办法将缓冲区或块输入置零 我的脚本应该在整个执行过程中的不同点接受输入。它确实需要输入非常好的数据。问题是当我在ReadKey()调用之间时,一些键被意外按下。这些键被存储在某种不可见的按键队列中,然后它们都被自动送入下一个ReadKey()调用,这完全违背了提示用户有意输入的目的,从而破坏了脚本 我到处都在寻找这个问题的答案,但问题的一部分是这个问题很难在短时间内描述!我已经尝

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()
调用之间输出脚本执行期间的第一次击键,循环,然后输出第二次击键,依此类推。当键击被耗尽时,它将静坐并等待输入,如预期的那样。

应考虑使用以下代码而不是<代码> [控制台]::Read Ky()< /C> < /P>
这将刷新缓冲区,然后等待按键,并在按键后从缓冲区刷新该键。它在ISE中不起作用,但如果您使用的是控制台,它可以正常工作。

完美。比以往任何时候都好。我应该知道有输入缓冲区的命令。感谢您提醒我注意这一点。如果您使用Powershell ISE中的代码运行脚本,您将收到调用带有“0”参数的“FlushInputBuffer”的
异常:“该方法或操作未实现。”
对,我甚至在回答中说它在ISE中不起作用。
$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()