다음을 통해 공유


about_Switch

간단한 설명

스위치를 사용하여 여러 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
}

매개 변수를 사용하지 switch 않는 경우 Exact 매개 변수를 사용하는 것과 동일하게 동작합니다. 값에 대해 대/소문자를 구분하지 않는 일치를 수행합니다. 값이 컬렉션이면 각 요소가 나타나는 순서대로 평가됩니다.

문에는 switch 하나 이상의 조건문이 포함되어야 합니다.

default 값이 조건과 일치하지 않으면 절이 트리거됩니다. 문의 절과 if 동일합니다else. 각 switch 문에는 하나의 default 절만 허용됩니다.

switch 에는 다음 매개 변수가 있습니다.

  • 와일드카드 - 조건이 와일드카드 문자열임을 나타냅니다. match 절이 문자열이 아니면 매개 변수가 무시됩니다. 비교는 대/소문자를 구분합니다.
  • Exact - 일치 절이 문자열인 경우 정확히 일치해야 임을 나타냅니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다. 비교는 대/소문자를 구분합니다.
  • CaseSensitive - 대/소문자를 구분하는 일치를 수행합니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다.
  • 파일 - .가 아닌 파일에서 입력을 가져옵니다 <test-expression>. 여러 파일 매개 변수가 포함된 경우 마지막 매개 변수만 사용됩니다. 파일의 각 줄은 문에 의해 읽고 평가됩니다 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"를 사용하거나 -Regex 매개 변수를 -Wildcard 사용해야 합니다.

   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!' }
}

값이 여러 조건과 일치하면 각 조건에 대한 작업이 실행됩니다. 이 동작을 변경하려면 키워드를 continue 사용합니다break.

키워드는 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

참고 항목