切换在PowerShell中没有给出正确的结果

时间:2016-07-12 16:59:01

标签: powershell switch-statement

我正在尝试使用简单的代码来测试PowerShell中的Switch语句。对于没有落入通过Switch语句处理的任何条件的条件,它没有运行正确的脚本块。

$Age = Read-Host "Age"

Switch ($Age)
{
    { (($_ -gt 0) -and ($_ -le 25)) } { Write-Host "You are too young" }
    { (($_ -gt 25) -and ($_ -le 50)) } { Write-Host "You are still young" }
    { (($_ -gt 50) -and ($_ -le 75)) } { Write-Host "You are Closer to your death" }
    { (($_ -gt 75) -and ($_ -le 99)) } { Write-Host "I am surprised you are still alive" }
    Default { "Invalid age" }
}

例如:如果输入-12或110作为$Age参数的值,它应运行默认块(无效年龄),但它正在运行第一个条件。

Age: -12
You are too young

Age: 110
You are too young

但是,它适用于0-99之间的其他值。

Age: 12
You are too young

Age: 30
You are still young

Age: 55
You are Closer to your death

Age: 88
I am surprised you are still alive

有人可以建议这里出了什么问题吗?

1 个答案:

答案 0 :(得分:3)

这是因为Powershell是动态类型的。变量$Age可以是字符串或整数(或其他东西......),这会增加模糊性。像这样,

$Age = Read-Host "Age"
Age: 110
PS C:\> $Age.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

$Age = Read-Host "Age"
Age: 55
PS C:\> $Age.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType

为了使变量成为int,请将其声明为:

[int]$Age = Read-Host "Age"
Age: 110
PS C:\> $Age.GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Int32                                    System.ValueType