2016-07-27 3 views
1

У меня есть код, который ведет себя странно, и я не уверен, почему. Я пытаюсь проверить, что пользовательский ввод является числом и что он меньше 255. Довольно легко.подтверждение ввода пользовательской команды powershell не принимает действительный ввод

Проблема в том, что числа от 26 до 99 недействительны для меня в ходе тестирования. 1-25 хороши, а 100+ тоже выглядят хорошо .. но по какой-то причине 26-99 держу меня в петле.

DO 
{ 
$ip_addr_first = Read-Host 'enter a number less than 255' 
} while ($ip_addr_first -notmatch '\p{Nd}+' -or $ip_addr_first -gt 255) 

write-host 'You entered' $ip_addr_first 

Предложения приветствуются, где проблема, так как я в затруднении здесь.

ответ

0

Попробуйте

do 
{ 
    $ip_addr_first = Read-Host 'Enter an integer between 0 and 255' 
} while ($ip_addr_first -notmatch '^\p{Nd}+$' -or [int] $ip_addr_first -gt 255) 

write-host 'You entered:' $ip_addr_first 

[int] Обратите внимание на бросок, который гарантирует, что $ip_addr_first сравнивается как числа, что делает все различия здесь.

Без этого, учитывая, что $ip_addr_first является строкой (типа, возвращаемый Read-Host), -gt выполняет лексической сравнения, и 26 является лексический больше, чем 255, например (то же относится и к любому количеству (строка), начиная с 3 или выше).

отметить также, что я якорь ваше регулярное выражение p{Nd}+ с ^ и $, чтобы гарантировать, что вход весь сравнивается с ним (вы могли бы сделать это более снисходительными, позволяя начальные и конечные пробелы).


Альтернативный подход, который использует ряд разборе только:

[int] $ip_addr_first = -1 
do 
{ 
    $userInput = Read-Host 'Enter an integer between 0 and 255' 
} while (-not ([int]::TryParse($userInput, [ref] $ip_addr_first) -and 
       $ip_addr_first -ge 0 -and $ip_addr_first -le 255)) 

write-host 'You entered:' $ip_addr_first 
+0

спасибо ... литая новый один для меня, так как я только учусь Powershell –

+0

@PS_newbie: С удовольствием; в PowerShell вам часто не нужно беспокоиться о типах, но иногда вы это делаете - как правило, стоит понять базовые типы (.NET) и как их можно проверить («Get-Member») и преобразовать. Мое альтернативное решение показывает вам, как вводить ограничения типа во время инициализации (постоянный отбор, в виде речи). – mklement0

Смежные вопросы