我正在尝试使用简单的代码来测试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
有人可以建议这里出了什么问题吗?
答案 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