2016-03-03 50 views
1

這沒有任何意義。 如果我把這個線在我的腳本 它仍然會接受一個數字作爲123,即使它應該是它的線until ($setSubNetMask -cle 32 -and $setSubNetMask -cge 1)我有這個問題只是1到32之間 。Powershell IF如果多個條件不起作用

這是怎麼回事?

do 
{ 
    $setSubNetMask = 0 
    $setSubNetMask = Read-Host -Prompt "Subnetmask (CIDR)" 
    if ($setSubNetMask -cge 32 -or $setSubNetMask -cle 2) 
    { 
     write-host "Felaktig CIDR (1-32)" 
    } 
} 
until ($setSubNetMask -cle 32 -and $setSubNetMask -cge 1) 

回答

1

Read-Host給你一個字符串。您將它與一個數字進行比較,該數字正在隱式轉換爲字符串,因爲它位於比較的右側。

你想要做什麼是轉換爲數字第一:

do 
{ 
    $setSubNetMask = 0 
    [int]$setSubNetMask = Read-Host -Prompt "Subnetmask (CIDR)" 
    if ($setSubNetMask -cge 32 -or $setSubNetMask -cle 2) 
    { 
     write-host "Felaktig CIDR (1-32)" 
    } 
} 
until ($setSubNetMask -cle 32 -and $setSubNetMask -cge 1) 

PowerShell還支持範圍,所以你的條件語句可以更好地表述爲:

do 
{ 
    $setSubNetMask = 0 
    $setSubNetMask = Read-Host -Prompt "Subnetmask (CIDR)" 
    if (1..32 -notcontains $setSubNetMask) 
    { 
     write-host "Felaktig CIDR (1-32)" 
    } 
} 
until (1..32 -contains $setSubNetMask) 

在PowerShell中v3和更高,您可以使用-in運算符而不是-contains來反轉訂單,具體取決於您感覺更自然:

do 
{ 
    $setSubNetMask = 0 
    $setSubNetMask = Read-Host -Prompt "Subnetmask (CIDR)" 
    if ($setSubNetMask -notin 1..32) 
    { 
     write-host "Felaktig CIDR (1-32)" 
    } 
} 
until ($setSubNetMask -in 1..32) 

注意,在這些例子中,我刪除了[int]投;這是不需要的,轉換將在任何一種情況下隱式完成。

1

正如@briantist指出的,這是由於Read-Host返回一個字符串值,然後將其與[int]進行比較。

當比較不同的對象類型,Powershell的將試圖做試圖通過投射在RH側的值,以匹配在LH側的類型執行操作。這意味着您可以通過顛倒比較參數的順序來隱式地將字符串重新轉換爲[int],以使[int]位於左側:

do 
{ 
    $setSubNetMask = 0 
    $setSubNetMask = Read-Host -Prompt "Subnetmask (CIDR)" 
    if (32 -le $setSubNetMask -or 2 -gt $setSubNetMask) 
    { 
     write-host "Felaktig CIDR (1-32)" 
    } 
} 
until (32 -le $setSubNetMask -and 1 -le $setSubNetMask)