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

标签 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() 调用之间的脚本执行期间进行的第一个击键,循环,然后输出第二个击键,依此类推。当击键用尽时,它将像预期一样等待输入。

最佳答案

您应该考虑使用以下内容而不是[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/

相关文章:

windows - 替换/更新文件共享上的特定文件

python - PowerShell 包装器将管道输入定向到 Python 脚本

xml - xml 文件中的 Powershell 变量范围

bash - cd-vs cd ..说明

c# - .NET API 运行 powershell 脚本

PowerShell循环性能: why does adding a function call make this loop faster?

c# - 在 PowerShell 上通过 Rest 获取自定义对象

powershell - 如何从 PowerShell 中的 Windows 更新获取更新历史记录?

c# - 使用 DefaultDisplayPropertySet 从 C# 进行 PowerShell 输出格式化

python - Powershell 可以从 stdin 读取代码吗?