Как предотвратить сценарий Powershell от чтения непреднамеренного ввода - PullRequest
1 голос
/ 25 июня 2019

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 голосов
/ 25 июня 2019

Вы должны рассмотреть возможность использования следующего вместо [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, но если вы используете консоль, она будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...