Articles

모든 것을 당신이 이제까지에 대해 알고 싶어 switch 문

  • 03/01/2021
  • 12 분 읽
    • c
    • x

좋아하는 많은 다른 언어,PowerShell 는 명령의 흐름을 제어하는 내에서 실행 yourscripts. 그 문 중 하나는 switch 문이고 PowerShell 에서는 다른 언어에서는 찾을 수없는 기능을 제공합니다. 오늘,우리는 PowerShellswitch작업에 깊은 다이빙을.

참고

이 기사의 원본 버전은@KevinMarquette 가 작성한 블로그에 나타났습니다. ThePowerShell 팀은이 콘텐츠를 우리와 공유해 주신 Kevin 에게 감사드립니다. 을 확인하시기 바랍니 그의 블로그 atPowerShellExplained.com.

if 문

첫 번째 중 하나는 문을 배우는if$true인 스크립트 blockif 를 실행할 수 있습니다.

if ( Test-Path $Path ){ Remove-Item $Path}

할 수 있습이 훨씬 더 복잡한 논리를 사용하여elseifelse문입니다. 여기에 예제가 있습니다.요일에 대한 숫자 값이 있고 문자열로 이름을 얻고 싶습니다.

$day = 3if ( $day -eq 0 ) { $result = 'Sunday' }elseif ( $day -eq 1 ) { $result = 'Monday' }elseif ( $day -eq 2 ) { $result = 'Tuesday' }elseif ( $day -eq 3 ) { $result = 'Wednesday' }elseif ( $day -eq 4 ) { $result = 'Thursday' }elseif ( $day -eq 5 ) { $result = 'Friday' }elseif ( $day -eq 6 ) { $result = 'Saturday' }$result
Wednesday

는 것이 밝혀졌 이것은 일반적인 패턴이 있을 처리하는 방법에는 여러 가지 이다. 그 중 하나는switch입니다.

스위치 문

switch문을 사용하면 변수 및 가능한 값 목록을 제공 할 수 있습니다. Valuematches 변수가 있으면 해당 scriptblock 이 실행됩니다.

$day = 3switch ( $day ){ 0 { $result = 'Sunday' } 1 { $result = 'Monday' } 2 { $result = 'Tuesday' } 3 { $result = 'Wednesday' } 4 { $result = 'Thursday' } 5 { $result = 'Friday' } 6 { $result = 'Saturday' }}$result
'Wednesday'

이 예를 들어,값의$day경기 중 하나의 숫자 값이 다음의 올바른 이름을 isassigned 을$result. 이 예제에서는 변수 할당 만 수행하지만 모든 powershell 은 해당 스크립트 블록에서 실행될 수 있습니다.

변수에 할당

마지막 예제를 다른 방법으로 작성할 수 있습니다.

$result = switch ( $day ){ 0 { 'Sunday' } 1 { 'Monday' } 2 { 'Tuesday' } 3 { 'Wednesday' } 4 { 'Thursday' } 5 { 'Friday' } 6 { 'Saturday' }}

우리는 배치에서 값 PowerShell 파이프라인 및 할당하는$result. 할 수 있습 dothis 와 같은 일을ifforeach문입니다.

Default

우리가 사용할 수 있는default키워드를 사용하여 일어나야 하는 것이 없는 경우에 일치합니다.

$result = switch ( $day ){ 0 { 'Sunday' } # ... 6 { 'Saturday' } default { 'Unknown' }}

여기서 기본 경우Unknown값을 반환합니다.

문자열

마지막 예제에서 숫자를 일치 시켰지만 문자열을 일치시킬 수도 있습니다.

$item = 'Role'switch ( $item ){ Component { 'is a component' } Role { 'is a role' } Location { 'is a location' }}
is a role

하지 않기로 결정했 포장ComponentRoleLocationswitch는 대부분의 경우이를 문자열로 처리합니다.

배열

PowerShellswitchswitch배열을 제공하면 해당 컬렉션의 각 요소를 처리합니다.

$roles = @('WEB','Database')switch ( $roles ) { 'Database' { 'Configure SQL' } 'WEB' { 'Configure IIS' } 'FileServer' { 'Configure Share' }}
Configure IISConfigure SQL

경우 반복되는 항목에서 당신의 배열을,그 다음 그들이 일치에 의해 여러 번은 해당 섹션.

PSItem

사용할 수 있습니다$PSItem$_를 참조 현재의 항목을 처리됩니다. Asimple match 를 수행 할 때$PSItem는 일치하는 값입니다. 이 변수가 사용되는 다음 섹션에서 일부 고급 일치를 수행 할 것입니다.

매개 변수를

독특한 기능의 PowerShellswitch은 그의 스위치 매개 변수 thatchange 어떻게이 수행 할 수 있습니다.

-CaseSensitive

일치 항목은 기본적으로 대소 문자를 구분하지 않습니다. 대소 문자를 구분해야하는 경우-CaseSensitive를 사용할 수 있습니다. 이것은 다른 스위치 매개 변수와 함께 사용될 수있다.

-와일드 카드

-wildcard-like연산자와 동일한 와일드 카드 논리를 사용하여 각 일치를 수행합니다.

$Message = 'Warning, out of disk space'switch -Wildcard ( $message ){ 'Error*' { Write-Error -Message $Message } 'Warning*' { Write-Warning -Message $Message } default { Write-Information $message }}
WARNING: Warning, out of disk space

여기서 우리는 메시지를 처리한 다음 출력하는 그것에 스트림에 따라 내용입니다.

-Regex

switch 문은 와일드 카드처럼 정규식 일치를 지원합니다.

switch -Regex ( $message ){ '^Error' { Write-Error -Message $Message } '^Warning' { Write-Warning -Message $Message } default { Write-Information $message }}

나는 더 많은 예제의 정규식을 사용하여 다른 문서에서 내가 쓴:는 많은 방법을 사용하 regex.

-File

switch 문의 알려진 기능은-File-file를 사용합니다.

switch -Wildcard -File $path{ 'Error*' { Write-Error -Message $PSItem } 'Warning*' { Write-Warning -Message $PSItem } default { Write-Output $PSItem }}

배열을 처리하는 것처럼 작동합니다. 이 예에서는 와일드 카드 일치와 결합합니다.$PSItem를 사용하십시오. 이것은 로그 파일을 처리하고 정규식 일치에 따라 경고 및 errormessages 로 변환합니다.

고급 세부 사항

이제는 당신이 알고 있는 이 모든 문서화 기능을,우리가 사용할 수 있습니다 그들의 컨텍스트에서 moreadvanced 처리합니다.

표현식

switch는 변수 대신 표현식에있을 수 있습니다.

switch ( ( Get-Service | Where status -eq 'running' ).name ) {...}

식이 평가하는 것은 일치에 사용 된 값입니다.

여러 일치

이미 이것을 포착했을 수도 있지만switch는 여러 조건과 일치 할 수 있습니다. 이 isespecially 진정한 사용할 때는-wildcard-regex일치합니다. 동일한 조건 다중 시간을 추가 할 수 있으며 모두 트리거됩니다.

switch ( 'Word' ){ 'word' { 'lower case word match' } 'Word' { 'mixed case word match' } 'WORD' { 'upper case word match' }}
lower case word matchmixed case word matchupper case word match

모두 세 가지의 문장이다. 이것은 모든 조건이(순서대로)확인되었음을 보여줍니다. Thisholds 는 각 항목이 각 조건을 확인하는 배열을 처리하는 데 적합합니다.

계속

정상적으로,이것은 내가 소개하는breakcontinueforeachcontinueswitch없는 경우에는 더 많은 항목입니다. 마지막 예제를 다시 작성할 수 있습니다.하나의 명령문 만 실행되도록 명령문을 계속하십시오.

switch ( 'Word' ){ 'word' { 'lower case word match' continue } 'Word' { 'mixed case word match' continue } 'WORD' { 'upper case word match' continue }}
lower case word match

대신에 일치하는 세 가지 모든 항목은,첫 번째 매치하며 스위치를 계속하 nextvalue. 처리 할 값이 남아 있지 않으므로 스위치가 종료됩니다. 이 다음 예제는 와일드 카드가 여러 항목과 일치 할 수있는 방법을 보여줍니다.

switch -Wildcard -File $path{ '*Error*' { Write-Error -Message $PSItem continue } '*Warning*' { Write-Warning -Message $PSItem continue } default { Write-Output $PSItem }}

기 때문에 라인에서의 입력 파일을 포함할 수 있는 단어가 모두ErrorWarning,우리는 첫 번째 중 하나를 실행하고 다음 계속 처리하는 파일입니다.

Break

Abreakcontinue가 singlevalues 에 대해 제시하는 것과 동일한 동작입니다. 배열을 처리 할 때 차이가 표시됩니다. breakcontinue는 다음 항목으로 이동합니다.

$Messages = @( 'Downloading update' 'Ran into errors downloading file' 'Error: out of disk space' 'Sending email' '...')switch -Wildcard ($Messages){ 'Error*' { Write-Error -Message $PSItem break } '*Error*' { Write-Warning -Message $PSItem continue } '*Warning*' { Write-Warning -Message $PSItem continue } default { Write-Output $PSItem }}

Downloading updateWARNING: Ran into errors downloading filewrite-error -message $PSItem : Error: out of disk space+ CategoryInfo : NotSpecified: (:) , WriteErrorException+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException

이 경우,우리는 어떤 라인으로 시작하는ErrorbreakError가 있고 처음에 notjust 를 찾으면 경고로 씁니다. 우리는WarningErrorWarning라는 단어가 모두있을 수 있지만 하나의 toprocess 만 있으면됩니다. 이것은continue문이 우리를 위해하고있는 것입니다.

레이블

switchbreak/continueforeach.

:filelist foreach($path in $logs){ :logFile switch -Wildcard -File $path { 'Error*' { Write-Error -Message $PSItem break filelist } 'Warning*' { Write-Error -Message $PSItem break logFile } default { Write-Output $PSItem } }}

나 개인적으로 좋아하지 않의 사용 레이블만 원을 지적하기 때문에 그들은 ‘reconfusing 는 경우에 당신은 그들을 본 적이 없다. 여러 개 있는 경우에는switchforeachstatementsthat 는 중첩된할 수 있습니다 휴식하는 것보다 더 가장 내부의 항목입니다. 당신은 당신의break의 대상이 될 수있는 labelon aswitch를 배치 할 수 있습니다.

열거 형

PowerShell5.0 은 열거 형을 주었고 스위치에서 사용할 수 있습니다.

enum Context { Component Role Location}$item = ::Roleswitch ( $item ){ Component { 'is a component' } Role { 'is a role' } Location { 'is a location' }}
is a role

을 유지하려면 모든 것을 강력하게 입력 열거형,다음을 배치할 수 있습니다 그들에 괄호 안에 표시됩니다.

switch ($item ){ (::Component) { 'is a component' } (::Role) { 'is a role' } (::Location) { 'is a location' }}

괄호는 필요 여기도록 스위치지 않는 치료의 가치::Locationasa 문자열.

ScriptBlock

필요한 경우 scriptblock 을 사용하여 일치에 대한 평가를 수행 할 수 있습니다.

$age = 37switch ( $age ){ {$PSItem -le 18} { 'child' } {$PSItem -gt 18} { 'adult' }}
'adult'

이 복잡성을 추가할 수 있습의switch열심히 읽을 수 있습니다. 대부분의 경우는 usesomething 다음과 같이 더 나은 것을 사용하는ifelseif문입니다. 해 경우에 따라서 이미 큰 스위치고 내가 필요로 두 항목을 동일한 evaluationblock.가독성에 도움이된다고 생각하는 한 가지는 괄호 안에 스크립트 블록을 배치하는 것입니다.

switch ( $age ){ ({$PSItem -le 18}) { 'child' } ({$PSItem -gt 18}) { 'adult' }}

그것은 아직도 실행하고 같은 방식을 더 나은 시각적 인 휴식할 때 빠르게 찾고 있습니다.

Regex$matches

우리는 즉시 명백하지 않은 것을 만지기 위해 regex 를 다시 방문해야합니다. Regexpopulates 의 사용은$matches변수를 사용합니다. 나는 regex 를 사용하는 여러 가지 방법에 대해 이야기 할 때$matches더 많이 사용합니다. 다음은 명명 된 일치와 행동에 표시하는 빠른 샘플입니다.

$message = 'my ssn is 123-23-3456 and credit card: 1234-5678-1234-5678'switch -regex ($message){ '(?<SSN>\d\d\d-\d\d-\d\d\d\d)' { Write-Warning "message contains a SSN: $($matches.SSN)" } '(?<CC>\d\d\d\d-\d\d\d\d-\d\d\d\d-\d\d\d\d)' { Write-Warning "message contains a credit card number: $($matches.CC)" } '(?<Phone>\d\d\d-\d\d\d-\d\d\d\d)' { Write-Warning "message contains a phone number: $($matches.Phone)" }}
WARNING: message may contain a SSN: 123-23-3456WARNING: message may contain a credit card number: 1234-5678-1234-5678

$null

할 수 있는 경기$null는 값 없이 될 기본입니다.

$value = $nullswitch ( $value ){ $null { 'Value is null' } default { 'value is not null' }}```OutputValue is null

빈 문자열에 대해서도 마찬가지입니다.

switch ( '' ){ '' { 'Value is empty' } default { 'value is a empty string' }}```OutputValue is empty

리 데일리는 지적에는 우리가 사용할 수 있는 일정한$true항목입니다.일어날 필요가있는 몇 가지 부울 검사가 있는지 상상해보십시오.

$isVisible = $false$isEnabled = $true$isSecure = $trueswitch ( $true ){ $isEnabled { 'Do-Action' } $isVisible { 'Show-Animation' } $isSecure { 'Enable-AdminMenu' }}
Do-ActionEnabled-AdminMenu

이것은 깨끗하는 방법을 평가하고 작업의 상태에 대한 여러 가지는 부울 필드가 있습니다. 이것에 대한 멋진 점은 하나의 일치가 아직 평가되지 않은 값의 상태를 뒤집을 수 있다는 것입니다.

$isVisible = $false$isEnabled = $true$isAdmin = $falseswitch ( $true ){ $isEnabled { 'Do-Action' $isVisible = $true } $isVisible { 'Show-Animation' } $isAdmin { 'Enable-AdminMenu' }}
Do-ActionShow-Animation

설정$isEnabled$true$isVisible$true$isVisible가 평가되면 scriptblock 이 호출됩니다. 이것은 조금 직관적이지만 역학의 영리한 사용입니다.

$switch automatic variable

switch$switch를 호출합니다. 이것은 PowerShell 에 의해 생성 된 자동 변수이며 직접 조작 할 수 있습니다.

$a = 1, 2, 3, 4switch($a) { 1 { $switch.MoveNext(); $switch.Current } 3 { $switch.MoveNext(); $switch.Current }}

이것은 당신의 결과는:

24

이동하여 열거자는 앞으로 다음 항목을 얻을하지 않으로 처리switch하지만 당신은 canaccess 는 값이 직접 있습니다. 나는 그것을 광기라고 부를 것이다.

기타 패턴

해시 테이블

중 하나의 가장 인기 게시물이나 나에 해시 테이블. hashtableswitch문이 종종 주소 지정되는 일반적인 패턴에 대한 대체 접근 방식입니다.

$day = 3$lookup = @{ 0 = 'Sunday' 1 = 'Monday' 2 = 'Tuesday' 3 = 'Wednesday' 4 = 'Thursday' 5 = 'Friday' 6 = 'Saturday'}$lookup
Wednesday

경우에만 사용하는switchhashtable대신 합니다.

열거 형

PowerShell5.0 은Enum를 도입했으며이 경우에도 옵션입니다.이 문제를 해결하기 위해 다른 방법을 살펴보고 하루 종일 갈 수 있습니다. 난 그냥 당신이 옵션을 가지고 새로운 당신을 확인하고 싶었다.

switch 문는 표면에 간단하지만 일부를 제공하는 고급 기능장 peopledon 것을 사용할 수 있습니다. 이러한 기능을 함께 묶으면 강력한 기능이됩니다. 나는 당신이 전에 깨닫지 못했던 것을 배웠 으면 좋겠다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다