2016-07-12 3 views
1

PowerShell에서 Switch 문을 테스트하는 간단한 코드를 사용하려고합니다. Switch 문을 통해 처리되는 조건 중 하나에 속하지 않는 조건에 대해 올바른 스크립트 블록을 실행하지 않습니다. 예를 들어스위치가 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" } 
} 

: 당신이 입력 -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 

누군가가 여기에 무슨 문제가 있다고 제안 할 수 있습니까?

답변

3

Powershell이 ​​동적으로 입력되므로 이러한 현상이 발생합니다. 변수 $Age은 모호성을 높이는 문자열 또는 정수 (또는 다른 것 ...) 일 수 있습니다. 변수 int을하기 위해

$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]$Age = Read-Host "Age" 
Age: 110 
PS C:\> $Age.GetType() 

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

또 다른 방법은'($ _ -gt 0)'순서를 교환하는 것입니다 ->'(0 -lt $ _)', 암시 적 캐스팅은 오른쪽에있는 것을 왼쪽에 일치시키는 경향이 있으므로 왼쪽에 숫자를 넣으십시오. – TessellatingHeckler

+0

와우 !! 우수한. 그건 완벽하게 작동합니다. 데이터 유형 문제를 지적 해 주셔서 감사합니다. 나는 그것이 그런 식으로 작동 할 것이라고는 생각하지 못했습니다. – SavindraSingh

관련 문제