Самое простое решение - реагировать только на нажатия клавиш, которые приводят к печатному символу , а затем оценивать, какой символ был нажат с помощью оператора switch
.
* 1007. *
Примечание. Хотя клавиши-модификаторы Shift , Control и Alt сами по себе не считаются нажатиями клавиш, комбинации с печатным символом делай; поэтому, например, Alt-a обрабатывается так же, как 'a'
, а Control-a в качестве управляющего символа START OF HEADING, U+0001
.
Если вы хотите избежать этого, используйте вместо этого следующий вариант:
# Wait for a printable character to be pressed, but only if not combined
# with Ctrl or Alt.
while (($key=$host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')).Character -eq 0 -or
$key.ControlKeyState -notin 0, 'ShiftPressed') {}
$char = $key.Character
Примечание: Это работает только на Windows - на Unix платформах, свойство .ControlKeyState
, по-видимому, всегда 0
.
Однако, если вместо этого вы используете [Console]::ReadKey()
, вы можете заставить его работать на Unix -подобно платформам - что предполагает, что вы предполагаете, что ваш скрипт всегда выполняется в консоли (терминале), а не в других типах хостов PowerShell.
# Wait for a printable character to be pressed, but only if not combined
# with Ctrl or Alt.
while (($key = [Console]::ReadKey($true)).KeyChar -eq 0 -or
$key.Modifiers -notin 0, 'Shift') {}
$char = $key.KeyChar