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()
, повторяется цикл, затем выводится второе нажатие клавиши и т. Д. И т. Д.Когда нажатия клавиш исчерпаны, он будет сидеть и ждать ввода, как ожидалось.