2016-07-12 10 views
1

Ich versuche einfachen Code, um die Switch-Anweisung in PowerShell zu testen. Es wird nicht der richtige Skriptblock für die Bedingungen ausgeführt, die nicht zu einer der Bedingungen gehören, die durch Switch-Anweisungen gehandhabt werden.Switch gibt keine korrekten Ergebnisse in PowerShell

$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" } 
} 

Zum Beispiel: Wenn Sie Eingabe -12 oder 110 als Wert für $Age Parameter, sollte es den Standardblock (Ungültige Alter) laufen, aber es ist die erste Bedingung ausgeführt wird.

Age: -12 
You are too young 

Age: 110 
You are too young 

Allerdings funktioniert es perfekt für andere Werte zwischen 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 

Kann jemand bitte vorschlagen, was hier falsch läuft?

Antwort

3

Dies geschieht, da Powershell dynamisch typisiert wird. Die Variable $Age kann eine Zeichenfolge oder eine ganze Zahl (oder etwas anderes ...) sein, was die Mehrdeutigkeit erhöht. Wie so,

$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 

Um die Variable ein int zu machen, erklären sie als solche:

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

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

Ein weiterer Ansatz ist die Reihenfolge zu tauschen '($ _ -gt 0)' -> '(0 -lt $ _) ', da das implizite Casting dazu führt, dass das Ding auf der rechten Seite mit dem auf der linken Seite übereinstimmt, also setze die Zahl auf der linken Seite. – TessellatingHeckler

+0

Wow !! Ausgezeichnet. Das funktioniert perfekt. Vielen Dank, dass Sie auf das Problem mit dem Datentyp hingewiesen haben. Ich hätte nie gedacht, dass es so funktionieren würde. – SavindraSingh