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