Powershell IF,多种条件无法正常工作

时间:2016-03-03 21:34:33

标签: powershell

没有任何意义。 如果我把这些行放在我的脚本中 它仍将接受一个数字123,即使它应该只是在1到32之间。 它是until ($setSubNetMask -cle 32 -and $setSubNetMask -cge 1)我遇到问题的行。

这里发生了什么?

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)

2 个答案:

答案 0 :(得分: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 :(得分:1)

正如@briantist所说,这是由于EXECUTE返回一个字符串值,然后将其与Read-Host进行比较。

当比较不同的对象类型时,Powershell将尝试通过尝试在RH侧转换值以匹配LH端的类型来执行操作。这意味着您可以通过反转比较参数的顺序隐式地将字符串重新转换为[int],以便[int]位于LH端:

[int]