2019年3月14日木曜日

PowerShellでキー名を取得したい

PowerShellの中で、押したキーを値で判定したい時があります。

どのキーがどういう値を持っているのかを、連続的にコンソールに表示して確かめたい場合、以下のコマンドで行けます。



while($True){$Key=([Console]::ReadKey()).key; Write-Host (" => "+$Key);}

↑[Console]クラスのReadKey()だけで、一回限りのキー入力待機をしてくれます。

キー入力待機中に何でもいいからキーを入力すると(F11だとPowerShellが最大化・戻る表示になるので注意)、結果が返されます。

これをwhileでループさせて連続的に表示するようにしています。

終了する時は、Ctrlキー+Cキー+Enterキーの3キー同時押しです。



C:¥>while($True){$Key=([Console]::ReadKey()).key; Write-Host (" => "+$Key);}
  => F1
  => F2
  => F3
  => F4
  => F5
  => F6
  => F7
  => F8
  => F9
  => F10
1 => D1
2 => D2
3 => D3
4 => D4
5 => D5
6 => D6
7 => D7
8 => D8
9 => D9
0 => D0
- => OemMinus
^ => Oem7
\ => Oem5
 => Backspace
         => Tab
q => Q
w => W
e => E
r => R
t => T
y => Y
u => U
i => I
o => O
p => P
@ => Oem3
[ => Oem4
 => Enter
a => A
s => S
d => D
f => F
g => G
h => H
j => J
k => K
l => L
; => OemPlus
: => Oem1
] => Oem6
z => Z
x => X
c => C
v => V
b => B
n => N
m => M
, => OemComma
. => OemPeriod
/ => Oem2
\ => Oem102
  => LeftWindows
  => Spacebar
  => Applications
  => LeftArrow
  => UpArrow
  => DownArrow
  => RightArrow


↑実行結果ですが、終了するまで、キー入力を延々と受付るようになっています。

ちなみに、[Console]::ReadKey()の::というのは、Consoleクラスのスタティックメソッド(インスタンス化せずに使えるメソッド)なのですが、どんな種類のスタティックメソッドがあるのかを知りたい時は以下のコマンドでOKです。


[Console] | get-member -static -membertype method



   TypeName: System.Console

Name               MemberType Definition
----               ---------- ----------
Beep               Method     static void Beep(), static void Beep(int frequency, int duration)
Clear              Method     static void Clear()
Equals             Method     static bool Equals(System.Object objA, System.Object objB)
MoveBufferArea     Method     static void MoveBufferArea(int sourceLeft, int sourceTop, int sourceWidth, int sourceH...
OpenStandardError  Method     static System.IO.Stream OpenStandardError(), static System.IO.Stream OpenStandardError...
OpenStandardInput  Method     static System.IO.Stream OpenStandardInput(), static System.IO.Stream OpenStandardInput...
OpenStandardOutput Method     static System.IO.Stream OpenStandardOutput(), static System.IO.Stream OpenStandardOutp...
Read               Method     static int Read()
ReadKey            Method     static System.ConsoleKeyInfo ReadKey(), static System.ConsoleKeyInfo ReadKey(bool inte...
ReadLine           Method     static string ReadLine()
ReferenceEquals    Method     static bool ReferenceEquals(System.Object objA, System.Object objB)
ResetColor         Method     static void ResetColor()
SetBufferSize      Method     static void SetBufferSize(int width, int height)
SetCursorPosition  Method     static void SetCursorPosition(int left, int top)
SetError           Method     static void SetError(System.IO.TextWriter newError)
SetIn              Method     static void SetIn(System.IO.TextReader newIn)
SetOut             Method     static void SetOut(System.IO.TextWriter newOut)
SetWindowPosition  Method     static void SetWindowPosition(int left, int top)
SetWindowSize      Method     static void SetWindowSize(int width, int height)
Write              Method     static void Write(string format, System.Object arg0), static void Write(string format,...
WriteLine          Method     static void WriteLine(), static void WriteLine(bool value), static void WriteLine(char...


↑実行結果はこんな感じになります。

StaticメソッドはC#言語の知識がそのまま生かせるので直感的に使えるのがとてもありがたいですが、入力がとても長くなりがちなので、コンソールから入力するのはちょっと・・・という悩みがありますね。