Проверьте, является ли введенный пользователем номер, а затем выберите переключатель для печати. - PullRequest
0 голосов
/ 17 мая 2018

Код:

[int]$s = Read-Host "Enter number from 1-3"
switch ($s) {
  1 { $s = 'Apple' }
  2 { $s = 'Melon' } 
  3 { $s = 'Mango' }
} 
$s 

Вывод:

Невозможно преобразовать значение «Apple» в тип «System.Int32»,Ошибка ввода не была в правильном формате.

Итак, мой вопрос: как мне проверить, является ли мой ввод числом, и в то же время выбрать из моего переключателя?

Ответы [ 4 ]

0 голосов
/ 17 мая 2018

Как проверить, является ли мой ввод числом, и в то же время выбрать из моего переключателя?

How do you check if your input is a number? - я думаю, что вы ужеделая это, поскольку вы объявляете переменную $s как [int] в самом начале -

[int]$s = Read-Host "Enter number from 1-3"

Selecting from your switch - ошибка, которую вы получаете, связана с типомнесоответствие вашего ввода для read-host и переменной $s.$s - это, очевидно, целое число, когда вы присваиваете ему строку.Следовательно, ошибка. Вы должны снова ввести его, чтобы исправить это -

[int]$s = Read-Host "Enter number from 1-3"
switch ($s) {
1 { [string]$s = 'Apple' }
2 { [string]$s = 'Melon' } 
3 { [string]$s = 'Mango' }
} 
$s 

Если вы введете любое число, кроме 1, 2 или 3, то вы $s сохраните это число вЭто.Например, если вы введете 5, $s сохранит в нем 5, поскольку оператор switch не был выполнен.

0 голосов
/ 17 мая 2018

Проблема с вашим кодом в том, что после того, как вы определили $s как целое число, вы позже попытаетесь присвоить ему строковое значение.

Вместо этого вы можете сделать это:

[int]$s = Read-Host "Enter number from 1-3"

$result = switch ($s) {
  1 { 'Apple' }
  2 { 'Melon' } 
  3 { 'Mango' }
} 

$result

Обратите внимание, что я также упрощаю ваш код, возвращая результат переключения на $result вместо присвоения его внутри каждого условия.

Это работает, потому что $result является неопределенной переменной, которая становитсястрока, когда вы присваиваете ей одно значение.

Если вы хотите проверить, что входные данные являются целыми числами, вы можете также рассмотреть возможность сделать что-то вроде этого:

$input = Read-Host "Enter number from 1-3"

if (($input -isnot [int])) { Throw 'You did not provide a number as input' }

$result = switch ($input) {
  1 { 'Apple' }
  2 { 'Melon' } 
  3 { 'Mango' }
} 

$result
0 голосов
/ 17 мая 2018

Если у вас есть предопределенный набор параметров, подобных этому, рассмотрите возможность использования меню с несколькими вариантами выбора, например:

$title = "Select Fruit"
$prompt = "Which fruit is your favorite?"
$apple = New-Object System.Management.Automation.Host.ChoiceDescription "&Apple","Apple"
$melon= New-Object System.Management.Automation.Host.ChoiceDescription "&Melon","Melon"
$mango= New-Object System.Management.Automation.Host.ChoiceDescription "Man&go", "Mango"

$options = [System.Management.Automation.Host.ChoiceDescription[]]($apple, $melon, $mango)

$selectedFruit = $host.ui.PromptForChoice($title, $prompt, $options, 0) 

switch($selectedFruit)
{
    0 {Write-Host "You chose Apple"}
    1 {Write-Host "You chose Melon"}
    2 {Write-Host "You chose Mango"}
}

В ISE пользователь увидит приглашение GUI с кнопками для нажатия, а на консоли - меню с определенными разрешенными буквами для выбора (A, M и G в этом случае).

Преимущество этого метода заключается в том, что он похож на типичное приглашение PowerShell и будет проверять и повторять запрос, если пользователь введет недопустимое значение. Вы можете добавить опцию «выйти», чтобы у пользователя был простой способ пропустить все опции.

0 голосов
/ 17 мая 2018

Вам не нужно использовать целое число для объявления переменной:

$s = Read-Host "Enter number from 1-3"
switch ($s) {
  1 { $s = 'Apple' }
  2 { $s = 'Melon' } 
  3 { $s = 'Mango' }
} 
$s

А если вы проверите тип переменной:

enter image description here

...