간단한 설명
스위치를 사용하여 여러 if 문을 처리하는 방법을 설명합니다.
긴 설명
스크립트 또는 함수에서 조건을 확인하려면 if 문을 사용합니다.
if 문은 변수 값과 개체의 속성을 포함하여 다양한 유형의 조건을 확인할 수 있습니다.
여러 조건을 확인하려면 switch 문을 사용합니다.
switch 문은 일련의 if 문과 동일하지만 더 간단합니다.
switch 문은 각 조건과 선택적 작업을 나열합니다. 조건이 획득되면 작업이 수행됩니다.
switch 문은 $_ 사용하고 자동 변수를 $switch 수 있습니다. 자세한 내용은 및의 about_Automatic_Variables를 참조하세요.
문법
기본 switch 문 형식은 다음과 같습니다.
Switch (<test-expression>)
{
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
해당하는 if 문은 다음과 같습니다.
if (<result1-to-be-matched> -eq (<test-expression>)) {<action>}
if (<result2-to-be-matched> -eq (<test-expression>)) {<action>}
<test-expression> 값을 반환하기 위해 식 모드에서 계산되는 단일 식입니다.
<result-to-be-matched> 값이 입력 값과 비교되는 식입니다. 식에는 부울 값을 반환하는 리터럴 값(문자열 또는 숫자), 변수 및 scriptblock이 포함됩니다.
숫자로 인식되지 않는 모든 따옴색되지 않은 값은 문자열로 처리됩니다.
혼동 또는 의도하지 않은 문자열 변환을 방지하려면 항상 문자열 값을 따옴표로 묶어야 합니다. 식이 올바르게 평가되도록 괄호 ()식을 묶어 하위 식 만들기를 만듭니다.
<result-to-be-matched> 값이 비교 식의 왼쪽에 있음을 이해하는 것이 중요합니다. 즉, <test-expression> 결과는 오른쪽에 있으며 비교를 위해 왼쪽 값의 형식으로 변환할 수 있습니다. 자세한 내용은 about_Comparison_Operators 참조하세요.
default 값은 다른 일치 항목이 없을 때 사용되는 작업에 대해 예약됩니다.
$_ 자동 변수는 switch 문에 전달된 식의 값을 포함하며 <result-to-be-matched> 문의 범위 내에서 평가 및 사용할 수 있습니다.
전체 switch 문 구문은 다음과 같습니다.
switch [-regex | -wildcard | -exact] [-casesensitive] (<test-expression>)
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
또는
switch [-regex | -wildcard | -exact] [-casesensitive] -file filename
{
"string" | number | variable | { <value-scriptblock> } { <action-scriptblock> }
default { <action-scriptblock> } # optional
}
매개 변수가 사용되지 않으면 switchExact 매개 변수를 사용하는 것과 동일하게 동작합니다. 값에 대해 대/소문자를 구분하지 않는 일치를 수행합니다. 값이 컬렉션이면 각 요소가 나타나는 순서대로 평가됩니다.
switch 문에는 하나 이상의 조건문이 포함되어야 합니다.
값이 조건과 일치하지 않으면 default 절이 트리거됩니다.
else 문의 if 절과 동일합니다. 각 default 문에는 하나의 switch 절만 허용됩니다.
switch 매개 변수는 다음과 같습니다.
- 와일드카드 - 조건이 와일드카드 문자열임을 나타냅니다. match 절이 문자열이 아니면 매개 변수가 무시됩니다. 대소문자를 구분하지 않고 비교합니다.
- 정확한 - 일치 절이 문자열인 경우 정확히 일치해야 임을 나타냅니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다. 대소문자를 구분하지 않고 비교합니다.
- caseSensitive - 대/소문자를 구분하는 일치를 수행합니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다.
-
파일-
<test-expression>아닌 파일에서 입력을 가져옵니다. 여러 File 매개 변수가 포함된 경우 마지막 매개 변수만 사용됩니다. 파일의 각 줄은switch문에서 읽고 평가합니다. 대소문자를 구분하지 않고 비교합니다. -
Regex - 조건에 대한 값의 정규식 일치를 수행합니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다.
대소문자를 구분하지 않고 비교합니다.
$matches자동 변수는 일치하는 문 블록 내에서 사용할 수 있습니다.
비고
Regex 및 와일드카드같은 충돌하는 값을 지정할 때 지정된 마지막 매개 변수가 우선적으로 적용되며 충돌하는 모든 매개 변수는 무시됩니다. 여러 매개 변수 인스턴스도 허용됩니다. 그러나 나열된 마지막 매개 변수만 사용됩니다.
예시
다음 예제에서 switch 문은 테스트 값 3을 각 조건과 비교합니다. 테스트 값이 조건과 일치하면 작업이 수행됩니다.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
}
It is three.
이 간단한 예제에서는 값 3과 일치하는 값이 있더라도 목록의 각 조건과 값을 비교합니다. 다음 switch 문에는 값 3에 대한 두 가지 조건이 있습니다. 기본적으로 모든 조건이 테스트됨을 보여 줍니다.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."}
4 {"It is four."}
3 {"Three again."}
}
It is three.
Three again.
일치 후 비교를 중지하도록 switch 지시하려면 break 문을 사용합니다.
break 문은 switch 문을 종료합니다.
switch (3)
{
1 {"It is one."}
2 {"It is two."}
3 {"It is three."; Break}
4 {"It is four."}
3 {"Three again."}
}
It is three.
테스트 값이 배열과 같은 컬렉션인 경우 컬렉션의 각 항목이 나타나는 순서대로 평가됩니다. 다음 예제에서는 4와 2를 평가합니다.
switch (4, 2)
{
1 {"It is one." }
2 {"It is two." }
3 {"It is three." }
4 {"It is four." }
3 {"Three again."}
}
It is four.
It is two.
break 문은 다음 예제와 같이 각 값이 아니라 컬렉션에 적용됩니다.
switch 문은 값 4의 조건으로 break 문에 의해 종료됩니다.
switch (4, 2)
{
1 {"It is one."; Break}
2 {"It is two." ; Break }
3 {"It is three." ; Break }
4 {"It is four." ; Break }
3 {"Three again."}
}
It is four.
이 예제에서 switch 문은 해시 테이블의 값 형식을 테스트합니다. 실행할 scriptblock을 선택하려면 부울 값을 반환하는 식을 사용해야 합니다.
$var = @{A = 10; B = 'abc'}
foreach ($key in $var.Keys) {
switch ($var[$key].GetType()) {
{ $_ -eq [int32] } { "$key + 10 = $($var[$key] + 10)" }
{ $_ -eq [string] } { "$key = $($var[$key])" }
}
}
A + 10 = 20
B = abc
이 예제에서는 문자열 또는 숫자 데이터가 아닌 개체가 switch전달됩니다.
switch 개체에서 문자열 강제 변환을 수행하고 결과를 평가합니다.
$test = @{
Test = 'test'
Test2 = 'test2'
}
$test.ToString()
switch -Exact ($test)
{
'System.Collections.Hashtable'
{
'Hashtable string coercion'
}
'test'
{
'Hashtable value'
}
}
System.Collections.Hashtable
Hashtable string coercion
이 예제에서는 일치하는 사례가 없으므로 출력이 없습니다.
switch ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
}
default 절을 추가하면 다른 조건이 성공하지 않을 때 작업을 수행할 수 있습니다.
switch ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
Default {
"No matches"
}
}
No matches
대/소문자를 일치하려면 "14"라는 단어를 -Wildcard 또는 -Regex 매개 변수를 사용해야 합니다.
PS> switch -Wildcard ("fourteen")
{
1 {"It is one."; Break}
2 {"It is two."; Break}
3 {"It is three."; Break}
4 {"It is four."; Break}
"fo*" {"That's too many."}
}
That's too many.
다음 예제에서는 -Regex 매개 변수를 사용합니다.
$target = 'https://bing.com'
switch -Regex ($target)
{
'^ftp\://.*$' { "$_ is an ftp address"; Break }
'^\w+@\w+\.com|edu|org$' { "$_ is an email address"; Break }
'^(http[s]?)\://.*$' { "$_ is a web address that uses $($matches[1])"; Break }
}
https://bing.com is a web address that uses https
다음 예제에서는 스크립트 블록을 switch 문 조건으로 사용하는 방법을 보여 줍니다.
switch ("Test")
{
{$_ -is [String]} {
"Found a string"
}
"Test" {
"This $_ executes as well"
}
}
Found a string
This Test executes as well
다음 예제에서는 두 날짜 값이 포함된 배열을 처리합니다.
<value-scriptblock> 각 날짜의 Year 속성을 비교합니다.
<action-scriptblock> 2022년 초까지 환영 메시지 또는 일 수를 표시합니다.
switch ((Get-Date 1-Jan-2022), (Get-Date 25-Dec-2021)) {
{ $_.Year -eq 2021 } {
$days = ((Get-Date 1/1/2022) - $_).days
"There are $days days until 2022."
}
{ $_.Year -eq 2022 } { 'Welcome to 2022!' }
}
값이 여러 조건과 일치하면 각 조건에 대한 작업이 실행됩니다. 이 동작을 변경하려면 break 또는 continue 키워드를 사용합니다.
break 키워드는 처리를 중지하고 switch 문을 종료합니다.
continue 키워드는 현재 값 처리를 중지하지만 후속 값은 계속 처리합니다.
다음 예제에서는 숫자 배열을 처리하고 홀수인지 짝수인지를 표시합니다. 음수는 continue 키워드를 사용하여 건너뜁니다. 숫자가 아닌 값이 발견되면 break 키워드로 실행이 종료됩니다.
switch (1,4,-1,3,"Hello",2,1)
{
{$_ -lt 0} { continue }
{$_ -isnot [Int32]} { break }
{$_ % 2} {
"$_ is Odd"
}
{-not ($_ % 2)} {
"$_ is Even"
}
}
1 is Odd
4 is Even
3 is Odd