2016-07-27 81 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