간단한 설명
스위치를 사용하여 여러 조건문을 처리하는 방법을 설명합니다.
긴 설명
스크립트 또는 함수에서 조건을 확인하려면 문을 사용할 if 수 있습니다.
이 문은 if 변수 값과 개체의 속성을 포함하여 다양한 유형의 조건을 확인할 수 있습니다.
여러 조건을 확인하려면 문을 사용할 switch 수 있습니다. 이 switch 문은 일련의 if 문과 비슷하지만 더 간단합니다. 문은 switch 각 조건과 해당 작업을 나열합니다. 조건이 일치하면 작업이 수행됩니다.
중요합니다
이 문은 switch 비교하기 전에 모든 값을 문자열로 변환합니다.
Syntax
기본 switch 문 형식은 다음과 같습니다.
switch (<test-expression>) {
<result1-to-be-matched> {<action>}
<result2-to-be-matched> {<action>}
}
문의 구문 switch 은 다음 if 문과 유사합니다.
if ("$(<result1-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
if ("$(<result2-to-be-matched>)") -eq ("$(<test-expression>)") {<action>}
식에는 부울 값을 반환하는 리터럴 값(문자열 또는 숫자), 변수 및 scriptblock이 포함됩니다. 이 문은 switch 비교하기 전에 모든 값을 문자열로 변환합니다. 예제는 이 문서의 뒷부분에 있는 문자열 변환의 영향을 참조하세요.
식 <test-expression> 모드에서 평가됩니다. 식이 배열 또는 다른 열거 가능한 형식 switch 과 같은 둘 이상의 값을 반환하는 경우 문은 열거된 각 값을 개별적으로 평가합니다.
식은 <result-to-be-matched> 단일 값으로 확인되어야 합니다.
해당 값은 입력 값과 비교됩니다.
값 default 은 다른 일치 항목이 없을 때 사용되는 작업에 대해 예약됩니다.
문은 switch 자동 변수 및 $_ 자동 변수를 $switch 사용할 수 있습니다. 자동 변수는 문에 switch 전달된 식의 값을 포함하며 명령문 범위 <result-to-be-matched> 내에서 평가 및 사용할 수 있습니다. 자세한 내용은 about_Automatic_Variables를 참조하세요.
전체 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 절이 정확히 일치해야 임을 나타냅니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다. 비교는 대/소문자를 구분합니다.
- CaseSensitive - 대/소문자를 구분하는 일치를 수행합니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다.
-
파일 -
<test-expression>대신 파일에서 입력을 가져옵니다. 파일은 한 번에 한 줄을 읽고switch문으로 평가됩니다. 기본적으로 비교는 대/소문자를 구분하지 않습니다. File 매개 변수는 하나의 파일만 지원합니다. 여러 파일 매개 변수가 포함된 경우 마지막 매개 변수만 사용됩니다. 자세한 내용은 File 매개 변수 예제를 참조하세요. -
Regex - 조건에 대한 값의 정규식 일치를 수행합니다. match 절이 문자열이 아니면 이 매개 변수는 무시됩니다.
비교는 대/소문자를 구분합니다.
$Matches자동 변수는 일치하는 문 블록 내에서 사용할 수 있습니다.
참고 항목
Regex 및 와일드카드와 같이 충돌하는 값을 지정할 때 지정된 마지막 매개 변수가 우선적으로 적용되며 충돌하는 모든 매개 변수는 무시됩니다. 여러 매개 변수 인스턴스도 허용됩니다. 그러나 나열된 마지막 매개 변수만 사용됩니다.
예시
다음 예제에서는 문을 사용하는 방법을 보여 줍니다 switch .
단순 일치 예제
다음 예제에서 switch 문은 3 테스트 값을 각 조건과 비교합니다. 테스트 값이 조건과 일치하면 작업이 수행됩니다.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
}
It's three.
이 예제에서는 값이 목록의 각 조건과 비교됩니다. 다음 switch 문에는 모든 조건이 테스트되었음을 보여 주는 값 3에 대한 두 가지 조건이 있습니다.
switch (3) {
1 { "It's one." }
2 { "It's two." }
3 { "It's three." }
4 { "It's four." }
3 { "Three again." }
}
It's three.
Three again.
흐름 사용 break 및 continue 제어
값이 여러 조건과 일치하면 각 조건에 대한 작업이 실행됩니다. 이 동작을 변경하려면 키워드를 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
문자열 변환의 영향
입력 값과 비교 값이 모두 비교를 위해 문자열로 변환되는 모든 값입니다. 의도하지 않은 문자열 변환을 방지하려면 스크립트 블록을 사용하여 스위치 값을 평가합니다.
switch ( ([datetime]'1 Jan 1970').DayOfWeek ) {
4 { 'The integer value matches a Thursday.' }
"4" { 'The numeric string matches a Thursday.' }
"Thursday" { 'The string value matches a Thursday.' }
{ 4 -eq $_ } { 'The expression matches a Thursday.' }
}
date 개체의 DayOfWeek 속성은 열거형입니다. 열거형을 숫자 또는 문자열 값과 비교할 수 있지만 이 switch 문은 값을 열거형의 문자열 표현으로 변환합니다.
The string value matches a Thursday.
The expression matches a Thursday.
이 동작은 문의 비교 -eq 동작 if 과 다릅니다.
if (4 -eq ([datetime]'1 Jan 1970').DayOfWeek) {
'The integer value matches a Thursday.'
}
The value matches a Thursday.
이 예제에서는 해시 테이블이 문에 switch 전달됩니다.
switch 해시 테이블을 문자열로 변환합니다.
$test = @{
Test = 'test'
Test2 = 'test2'
}
$test.ToString()
System.Collections.Hashtable
해시 테이블의 문자열 표현이 테스트 키의 값과 동일하지 않습니다.
switch -Exact ($test) {
'System.Collections.Hashtable' { 'Hashtable string coercion' }
'test' { 'Hashtable value' }
}
Hashtable string coercion
해시 테이블의 값을 테스트하는 데 사용 switch
이 예제 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 ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
}
절을 default 추가하면 다른 조건이 성공하지 않을 때 작업을 수행할 수 있습니다.
switch ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
default { "No matches" }
}
No matches
단어 fourteen 대/소문자를 일치하려면 -Wildcard 또는 -Regex 매개 변수를 사용해야 합니다.
switch -Wildcard ("fourteen") {
1 { "It's one."; break }
2 { "It's two."; break }
3 { "It's three."; break }
4 { "It's four."; break }
"fo*" { "That's too many." }
}
That's too many.
다음으로 정규식 사용 switch
다음 예제에서는 매개 변수를 -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!' }
}
를 사용하여 파일의 내용을 읽습니다. switch
switch 매개 변수와 함께 문을 사용하면 큰 파일을 한 줄씩 처리하는 효율적인 방법입니다. PowerShell은 파일의 줄을 switch 문으로 스트리밍합니다. 각 줄은 개별적으로 처리됩니다.
작업 문의 break 키워드를 사용하여 파일 끝에 도달하기 전에 처리를 종료할 수 있습니다.
switch 문은 Get-Content 사용하여 큰 파일을 한 줄씩 처리하는 것보다 더 효율적입니다.
유연하고 효율적인 줄별 패턴 일치를 위해 switch -File-Wildcard 또는 -Regex 결합할 수 있습니다.
다음 예제에서는 PowerShell-Docs 리포지토리의 README.md 읽습니다.
##시작하는 줄에 도달할 때까지 각 줄을 출력합니다.
switch -Regex -File .\README.md {
'^##\s' { break }
default { $_; continue }
}
인수는 <filename> 와일드카드 식을 허용하지만 하나의 파일만 일치해야 합니다. 다음 예제는 <filename> 인수에서 와일드카드를 사용한다는 점을 제외하고 이전 예제와 동일합니다. 이 예제는 와일드카드 패턴이 하나의 파일과만 일치하기 때문에 작동합니다.
switch -Regex -File .\README.* {
'^##\s' { break }
default { $_; continue }
}
리터럴로 처리하려면 와일드카드로 해석할 수 있는 문자를 이스케이프해야 합니다.
$file = (New-Item -Path 'Temp:\Foo[0]' -Value Foo -Force).FullName
switch -File $file { Foo { 'Foo' } }
# No files matching '...\Temp\Foo[0]' were found.
$fileEscaped = [WildcardPattern]::Escape($file)
switch -File $fileEscaped { foo { 'Foo' } }
# Foo
참고하십시오
PowerShell