다음을 통해 공유


중단에_대하여

간단한 설명

, foreach, for, whiledo, 또는 switch 문을 즉시 종료trap하는 데 사용할 수 있는 문을 설명합니다.

긴 설명

break 문은 현재 제어 블록을 종료하는 방법을 제공합니다. 실행은 제어 블록이 끝난 후 다음 명령문에서 계속됩니다. 이 문구는 레이블을 지원합니다. 레이블은 스크립트에서 문에 부여하는 이름입니다.

루프 내에서 break 사용

루프 안에 break, foreach, for, 또는 do와 같은 while 문이 나타나면, PowerShell은 즉시 그 루프를 종료합니다.

break 문에는 포함된 루프를 종료할 수 있는 레이블이 포함될 수 있습니다. 레이블은 스크립트에서 foreach, for또는 while같은 루프 키워드를 지정할 수 있습니다.

다음 예제에서는 break 문을 사용하여 for 문을 종료하는 방법을 보여줍니다.

for($i=1; $i -le 10; $i++) {
   Write-Host $i
   break
}

이 예제에서 break 문은 for 변수가 1이면 $i 루프를 종료합니다. 문은 10보다 클 때까지 true 평가되지만 루프가 처음 실행될 때 PowerShell은 break 문에 도달합니다.

내부 조건이 충족되어야 하는 루프에서 break 문을 사용하는 것이 더 일반적입니다. 다음은 foreach 문장의 예입니다.

$i=0
$varB = 10,20,30,40
foreach ($val in $varB) {
  if ($val -eq 30) {
    break
  }
  $i++
}
Write-Host "30 was found in array index $i"

이 예제에서 foreach 문은 $varB 배열을 반복합니다. if 문은 루프가 처음 두 번 실행될 때 False로 평가되며, 그동안 변수 $i이 1씩 증가합니다. 루프가 세 번째로 실행되면 $i 2이고 $val 변수는 30과 같습니다. 이때 break 문이 실행되고 foreach 루프가 종료됩니다.

루프에서 라벨이 붙은 break 사용

break 문장에는 레이블이 포함될 수 있습니다. 레이블과 함께 break 키워드를 사용하는 경우 PowerShell은 현재 루프를 종료하는 대신 레이블이 지정된 루프를 종료합니다. 레이블은 콜론 뒤에 할당한 이름입니다. 레이블은 문의 첫 번째 토큰이어야 하며, 이후에 while같은 반복 키워드가 와야 합니다.

break는 지정된 레이블 루프에서 실행을 벗어납니다. 중첩된 루프에서는 break 키워드를 단독으로 사용할 때와 다른 결과가 나타납니다. 이 예제에는 while 문과 for 문이 있습니다.

:myLabel while (<condition 1>) {
  for ($item in $items) {
    if (<condition 2>) {
      break myLabel
    }
    $item = $x   # A statement inside the For-loop
  }
}
$a = $c  # A statement after the labeled While-loop

조건 2가 "True" 로 평가되면, 스크립트 실행은 레이블이 붙은 루프 이후의 문으로 건너뜁니다. 이 예제에서는 명령문 $a = $c실행이 다시 시작됩니다.

다음 예제와 같이 많은 레이블이 지정된 루프를 중첩할 수 있습니다.

:red while (<condition1>) {
  :yellow while (<condition2>) {
    while (<condition3>) {
      if ($a) {break}
      if ($b) {break red}
      if ($c) {break yellow}
    }
    Write-Host "After innermost loop"
  }
  Write-Host "After yellow loop"
}
Write-Host "After red loop"

$b 변수가 True로 평가되면 "빨간색"이라는 레이블이 지정된 루프 후에 스크립트 실행이 다시 시작됩니다. $c 변수가 True로 평가되면 "노란색"이라는 레이블이 지정된 루프 후에 스크립트 컨트롤의 실행이 다시 시작됩니다.

$a 변수가 True로 평가되면 가장 안쪽 루프 후에 실행이 다시 시작됩니다. 레이블이 필요하지 않습니다.

PowerShell은 레이블이 실행을 다시 시작할 수 있는 정도를 제한하지 않습니다. 레이블은 스크립트 및 함수 호출 경계 간에 제어를 전달할 수도 있습니다.

break 문에서 switch 사용

switch구문에서 break이 PowerShell이 switch 코드 블록을 종료하도록 합니다.

break 키워드는 switch 구문을 벗어나는 데 사용됩니다. 예를 들어 다음 switch 문은 break 문을 사용하여 가장 구체적인 조건을 테스트합니다.

$var = "word2"
switch -regex ($var) {
    "word2" {
      Write-Host "Exact" $_
      break
    }

    "word.*" {
      Write-Host "Match on the prefix" $_
      break
    }

    "w.*" {
      Write-Host "Match on at least the first letter" $_
      break
    }

    default {
      Write-Host "No match" $_
      break
    }
}

이 예제에서는 $var 변수를 만들고 word2문자열 값으로 초기화합니다. switch 문은 Regex와 클래스를 사용하여 변수 값을 word2용어와 먼저 일치하도록 합니다. 변수 값과 switch 문의 첫 번째 테스트가 일치하므로 switch 문의 첫 번째 코드 블록이 실행됩니다.

PowerShell이 첫 번째 break 문에 도달할 때, switch 문이 종료됩니다. 예제에서 4개의 break 문을 제거하면, 네 가지 조건이 모두 충족됩니다. 이 예제에서는 break 문을 사용하여 가장 구체적인 조건이 충족되면 결과를 표시합니다.

break 문에서 trap 사용

trap 문의 본문에서 실행된 최종 문이 break이면, 오류 개체가 억제되고 예외가 다시 던져집니다.

다음 예제에서는 문을 사용하여 트래핑되는 trap 예외를 만듭니다.

function test {
  trap [DivideByZeroException] {
    Write-Host 'divide by zero trapped'
    break
  }

  $i = 3
  'Before loop'
  while ($true) {
     "1 / $i = " + (1 / $i--)
  }
  'After loop'
}
test

주의하시면 예외에서 실행이 중지됩니다. After loop 도달하지 않습니다. trap가 실행된 후에 예외가 다시 발생합니다.

Before loop
1 / 3 = 0.333333333333333
1 / 2 = 0.5
1 / 1 = 1
divide by zero trapped
ParentContainsErrorRecordException:
Line |
  10 |       "1 / $i = " + (1 / $i--)
     |       ~~~~~~~~~~~~~~~~~~~~~~~~
     | Attempted to divide by zero.

루프, break또는 switch 외부에서 trap 사용하지 마세요.

이 이를 직접 지원하는 구문(루프, , )이 아닌 외부에서 사용될 때, PowerShell은 바깥쪽 구문을 찾기 위해 호출 스택 을 검색합니다. 포함하는 구문을 찾을 수 없는 경우, 현재 runspace는 아무런 알림 없이 종료됩니다.

즉, 지원하는 바깥 구문이 없는 곳에서 break을 실수로 사용하는 함수와 스크립트가 호출자를 실수로 종료시킬 수 있다는 의미입니다.

break파이프라인 내부에서 break를 사용하면, ForEach-Object 스크립트 블록 같은 경우에, 단순히 파이프라인을 종료하는 것에 그치지 않고 전체 런스페이스를 종료시킬 수 있습니다.

참고하십시오