다음을 통해 공유


about_Break

간단한 설명

break 현재 제어 블록을 종료하는 방법을 제공하는 문을 설명합니다.

자세한 설명

이 문은 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로 평가되더라도 for 루프가 처음 실행될 때 PowerShell은 break 문에 for 도달합니다. $i

내부 조건이 충족되어야 하는 루프에서 문을 사용하는 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 루프가 실행되고 변수 $i 가 1씩 증가하면 처음 두 번 False로 평가됩니다. 루프가 세 번째로 실행 $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은 레이블이 실행을 다시 시작할 수 있는 정도를 제한하지 않습니다. 레이블은 스크립트 및 함수 호출 경계 간에 제어를 전달할 수도 있습니다.

문에서 switch 사용 break

구문 break 에서 switchPowerShell이 코드 블록을 종료 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이 첫 번째 breakswitch 에 도달하면 문이 종료됩니다. 예제에서 네 break 개의 문이 제거되면 네 가지 조건이 모두 충족됩니다. 이 예제에서는 break 문을 사용하여 가장 구체적인 조건이 충족되면 결과를 표시합니다.

문에서 trap 사용 break

break본문 trap 에서 실행된 최종 문이 있으면 오류 개체가 표시되지 않으며 예외가 다시 throw됩니다.

다음 예제에서는 문을 사용하여 트래핑되는 DivideByZeroException 예외를 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 다시 throw됩니다.

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.

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

직접 지원하는 구문 외부에서 사용되는 경우 break (루프, switch, trap) PowerShell 은 바깥쪽 구문에 대한 호출 스택 을 조회합니다. 바깥쪽 구문을 찾을 수 없는 경우 현재 Runspace는 조용히 종료됩니다.

즉, 해당 함수와 스크립트를 지원하는 바깥쪽 구문 외부를 실수로 사용하는 break 함수와 스크립트는 실수로 호출자를 종료할 수 있습니다.

스크립트 블록과 같은 파이프라인 내부에서 사용하면 break 파이프라인 breakForEach-Object 종료할 뿐만 아니라 전체 Runspace가 종료될 수 있습니다.

참고 항목