2016-03-03 192 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)