개요
switch 문은 하나의 값을 여러 조건과 차례로 비교하는 구문으로, 54장에서 언급했듯 elseif가 여러 번 이어지는 상황을 대체하는 더 명료한 도구다. PowerShell의 switch는 다른 언어와 달리 와일드카드·정규식·파일 한 줄씩 읽기까지 지원한다는 점에서 훨씬 강력하다.
정신 모델은 “테스트 값을 조건 목록과 위에서부터 순서대로 비교하다가, 일치하는 모든 조건의 액션을 실행한다"는 것이다. C 계열 언어의 switch와 달리 기본적으로 첫 일치에서 멈추지 않는다 — 이 차이가 아래 함정에서 가장 중요하게 다뤄진다.
사용법
| |
종류
| 매개변수 | 설명 |
|---|---|
| (매개변수 없음, 기본) | -Exact와 동일 — 대소문자 구분 없는 정확한 일치 |
-Wildcard | *, ? 같은 와일드카드 패턴으로 비교 |
-Regex | 정규식(47장)으로 비교, 일치 시 $Matches 변수 사용 가능 |
-CaseSensitive | 위 모드들을 대소문자 구분 버전으로 |
-File <파일명> | 파일을 한 줄씩 읽어 switch에 흘려보냄(대용량 파일에 Get-Content보다 효율적) |
break | 그 즉시 switch 전체를 빠져나감 |
continue | 현재 값 처리를 멈추고 다음 값으로 넘어감(배열 입력 시) |
예시
| |
주의사항·함정
하나의 값이 여러 조건과 일치하면 기본적으로 모든 액션이 다 실행된다: C·JavaScript의 switch는 break가 없으면 다음 case로 “흘러내리지만”, PowerShell은 반대로 명시적으로 break를 쓰지 않는 한 이후의 모든 일치 조건도 계속 검사해 전부 실행한다. 조건 목록에 3이 두 번 있으면 두 액션이 모두 실행되는 것이 정상 동작이다. 다른 언어의 switch에 익숙하다면 이 반전된 기본값이 가장 흔한 실수의 원인이다 — 하나의 액션만 실행하고 끝내려면 각 블록 끝에 break를 명시해야 한다.
모든 비교는 값을 문자열로 변환한 뒤 이뤄진다: switch는 테스트 값과 조건을 비교하기 전에 둘 다 문자열로 바꾼다. ([datetime]'1 Jan 1970').DayOfWeek처럼 열거형(enum) 값을 switch에 넘기면, 그 값의 숫자 표현이 아니라 “Thursday” 같은 문자열 표현과 비교된다 — 같은 조건을 if ($x -eq $y)로 검사했을 때와 결과가 달라질 수 있다. 이 자동 변환을 피하려면 조건 자리에 { $_ -eq $값 }처럼 스크립트 블록을 써서 원래 타입 그대로 비교해야 한다.
해시테이블을 switch에 넘기면 예상과 다르게 동작한다: 44장에서 다룬 해시테이블을 switch (테스트값)에 그대로 넘기면, 해시테이블의 .ToString() 결과(“System.Collections.Hashtable”)와 비교된다 — 안의 키·값과는 비교되지 않는다. 해시테이블의 값을 검사하고 싶다면 먼저 foreach로 순회하며 각 값을 switch에 넘겨야 한다.
이식성: Bash의 case ... esac이 가장 가까운 대응이며 와일드카드 패턴을 기본 지원한다는 점은 비슷하지만, PowerShell처럼 정규식 모드나 파일 스트리밍 모드는 없다. CMD에는 switch 자체가 없어 여러 if를 연달아 쓰거나 goto로 흉내 낸다.
![Featured image of post [PowerShell] 55. switch 고급 모드 — 와일드카드/정규식/파일 처리](/post/powershell/switch-wildcard-regex-file-powershell/wordcloud_hu_517c0d94bfe832d1.webp)
![[PowerShell] 53. 스크립트 작성과 실행(.ps1)](/post/powershell/script-execution-ps1-powershell/wordcloud_hu_10c8d6c3936ccc0f.webp)
![[PowerShell] 54. if/elseif/else — 조건 분기](/post/powershell/if-elseif-switch-condition-powershell/wordcloud_hu_fd68a53ddac2fa5a.webp)
![[PowerShell] 55. switch 고급 모드 — 와일드카드/정규식/파일 처리](/post/powershell/switch-wildcard-regex-file-powershell/wordcloud_hu_106a3f1b500a0d85.webp)
![[PowerShell] 56. foreach/for/while/do-while — 반복문](/post/powershell/foreach-for-while-loop-powershell/wordcloud_hu_658b84b145d1a138.webp)
![[PowerShell] 57. 함수 정의와 매개변수](/post/powershell/function-parameter-definition-powershell/wordcloud_hu_77f6f557cee7aa03.webp)
![[PowerShell] 46. Select-String — 텍스트에서 패턴 찾기](/post/powershell/select-string-command-powershell/wordcloud_hu_76a0521c6b7afac7.webp)
![[PowerShell] 47. -match/-replace 연산자와 정규식](/post/powershell/match-replace-regex-powershell/wordcloud_hu_c39cd98b9fc6220f.webp)
![[PowerShell] 12. Where-Object — 필터링](/post/powershell/where-object-command-filter-pipeline-powershell/wordcloud_hu_75843f29a19f2cc5.webp)
![[PowerShell] 20. 비교 연산자 — -eq/-like/-contains/-in](/post/powershell/comparison-operators-eq-like-contains-in-powershell/wordcloud_hu_e39e3d06b7800d57.webp)