Читайте отдельные нажатия клавиш (целые числа) в PowerShell - PullRequest
0 голосов
/ 21 февраля 2019

Мне известен этот вопрос , но он не отвечает на мой текущий вопрос.

Я знаю, что текущая строка дает мне следующую нажатую клавишу:

$Host.UI.RawUI.ReadKey().Character

Например, если я нажму 1, я получу 1.

Но это строка (ну, на самом деле, это символ), я хочу, чтобы число было целым числом.

Я пытаюсь с:

[int]$Host.UI.RawUI.ReadKey().Character

И:

$Host.UI.RawUI.ReadKey().Virtualkeycode

Но в обеих строках, если вы нажмете 1, вместо этого вы получите 49.

Я знаю, что могу просто сделать:

[int]$Host.UI.RawUI.ReadKey().Character - 48

Но мне было интересно, есть ли лучший способ сделать это.Например, если я хочу получить как буквы, так и цифры, использование -48 усложнит задачу, поскольку мне нужно будет использовать некоторые условные блоки.

Итак, мой вопрос: Есть ли лучший способ получить нажатой клавишу (число) как целое число, а не [int]$Host.UI.RawUI.ReadKey().Character - 48?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Другой подход:

# (will return $null if non-numeric character entered)
$int = switch -regex ([console]::readkey($true).keychar) {'[0-9]' {[int]"$_"}}
0 голосов
/ 21 февраля 2019

У вас есть опция System.Int32.Parse:

PS> [int]::Parse

OverloadDefinitions
-------------------
static int Parse(string s)

Используется:

$in = $Host.UI.RawUI.ReadKey().Character
[int]::Parse($in)

Вы также можете использовать System.Int32.TryParse, если считаете, что пользовательвведет что-то нецелое:

PS> [int]::TryParse

OverloadDefinitions
-------------------
static bool TryParse(string s, [ref] int result)

Используется:

[int] $out = 0
$in = $Host.UI.RawUI.ReadKey().Character
if ([int]::TryParse($in, [ref]$out)) {
    $out
}
else {
    Write-Warning 'Non-int entered!'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...