HOWTO · PowerShell
PowerShell 스크립트의 특정 지점으로 이동하는 방법
PowerShell에는 GOTO 명령이 없습니다. function, if/switch, while/for, 레이블이 지정된 break/continue로 스크립트에서 특정 지점으로 이동하는 방법을 배웁니다.
이 페이지의 내용
PowerShell에는 goto 명령이 없습니다. cmd.exe 배치 파일에서는 GOTO :label로 레이블이 지정된 줄로 실행을 보내 앞부분을 건너뛰거나 뒤로 돌아갈 수 있습니다. PowerShell은 의도적으로 그 키워드를 제공하지 않습니다. 대신 이름이 있는 지점은 function을 호출하고, 경로는 if / elseif / else 또는 switch로 고르며, 반복은 while이나 for로 하고, 중첩 루프에서 빠져나올 때는 레이블이 지정된 break 또는 continue를 사용합니다.
이러한 제어 흐름 기능은 Windows PowerShell 5.1과 PowerShell 7에서 동일하게 동작합니다. 아래 예제는 PowerShell 7.6.6에서 검증되었습니다. 배치 스크립트를 옮기거나, 메뉴를 만들거나, 긴 .ps1 파일을 스파게티 점프 없이 정리할 때 사용하세요.
function으로 이름이 있는 지점으로 이동
function은 스크립트 다른 곳에서 호출할 수 있는 이름 있는 블록입니다. 이것이 “이 구간으로 점프”에 가장 안전한 PowerShell 대응이며, 배치의 CALL/레이블 서브루틴 패턴과 많은 GOTO 사용을 대체합니다. 스크립트 파일에서는 호출하기 전에 function을 정의하세요.
function Choice {
$continue = Read-Host "Do you want to continue?"
if ($continue -eq 'y') {
Write-Host "Welcome to PowerShell tutorials."
}
else {
Write-Host "Exited."
}
}
Choice
답이 y일 때의 출력:
Do you want to continue?: y
Welcome to PowerShell tutorials.
답이 y가 아닐 때의 출력:
Do you want to continue?: n
Exited.
해당 function에서만 일찍 빠져나와야 할 때는 return을 사용합니다. 다음 경계 사례는 음수 코드에 "invalid"를, 그렇지 않으면 "ok:<n>"을 반환합니다.
function Get-Status {
param([int]$Code)
if ($Code -lt 0) {
return "invalid"
}
return "ok:$Code"
}
Get-Status -Code -1
Get-Status -Code 2
invalid
ok:2
return은 현재 function, 스크립트 또는 스크립트 블록을 떠납니다. 호출자나 스케줄러를 위해 PowerShell 프로세스를 끝내고 프로세스 종료 코드를 설정하려는 경우가 아니라면 exit보다 return을 선호하세요. 재사용 가능한 작업을 function에 두면 전체 스크립트를 실행하지 않고도 한 지점만 호출해 테스트하기 쉽습니다.
if와 switch로 분기
조건문은 다음에 실행할 지점을 고릅니다. 선택지가 몇 개면 if / elseif / else 체인이면 충분합니다. 메뉴형 탐색에는 switch가 더 명확하며, IF ... GOTO sectionA 뒤에 사용하지 않는 구간을 건너뛰는 또 다른 GOTO가 있던 배치 패턴을 대체합니다.
$action = Read-Host "Enter 1 for date marker or 2 for greeting"
switch ($action) {
'1' { Write-Output "DATE_MARKER" }
'2' { Write-Output "Hello, welcome to the PowerShell tutorial!" }
default { Write-Output "Invalid option selected." }
}
2를 선택한 경우:
Enter 1 for date marker or 2 for greeting: 2
Hello, welcome to the PowerShell tutorial!
잘못된 옵션을 선택한 경우:
Enter 1 for date marker or 2 for greeting: x
Invalid option selected.
각 분기는 완전한 블록이므로 다른 구간을 “건너뛰기” 위한 두 번째 점프가 필요 없습니다.
while과 for로 반복
루프는 :start 같은 시작 레이블로 되돌아가는 점프를 구조적으로 대체합니다. while 문은 조건이 $true인 동안 블록을 실행합니다. 조건이 이미 $false이면 PowerShell은 블록을 건너뛰고 루프 뒤에서 계속합니다. 이는 임의의 레이블 점프가 아니라 제어된 건너뛰기입니다.
$a = 1
while ($a -lt 10) {
$a
$a++
}
1
2
3
4
5
6
7
8
9
경계 사례 — 루프 본문이 한 번도 실행되지 않음:
$a = 10
Write-Output "before"
while ($a -lt 10) {
$a
$a++
}
Write-Output "after"
before
after
초기화, 조건, 반복자를 함께 둘 때는 for 루프가 유용합니다.
for ($b = 1; $b -lt 6; $b++) {
Write-Host $b
}
1
2
3
4
5
적어도 한 번은 실행해야 하거나 컬렉션을 순회해야 하면 do/while, do/until, foreach도 같은 구조적 루프 아이디어를 따릅니다. 사용자가 종료할 때까지 메뉴를 다시 보여 주려면 프롬프트와 switch를 while ($true) 루프로 감싸고 종료 옵션에서 break하세요.
레이블이 지정된 break와 continue로 중첩 루프 종료
PowerShell 레이블은 배치 점프 대상이 아닙니다. :outer 같은 레이블은 루프나 switch 키워드 바로 앞에 올 수 있습니다. 그런 다음 break outer 또는 continue outer를 사용합니다. break/continue 줄에는 콜론을 붙이지 않습니다. Microsoft는 이 형식을 about_Break와 about_Continue에 문서화합니다. PowerShell 구문으로 goto :Label이나 break :Label을 보여 주는 페이지는 올바르지 않습니다.
:outer for ($i = 1; $i -le 3; $i++) {
for ($j = 1; $j -le 3; $j++) {
Write-Output "i=$i j=$j"
if ($j -eq 2) {
break outer
}
}
}
Write-Output "done"
i=1 j=1
i=1 j=2
done
$j가 2이면 break outer는 레이블이 지정된 바깥 루프를 완전히 떠나 Write-Output "done"에서 계속합니다. 레이블 없는 break는 안쪽 for만 떠납니다. 바깥 루프를 끝내기보다 현재 바깥 반복의 나머지를 건너뛰고 다음 반복을 시작하려면 continue outer를 사용하세요.
PowerShell goto :label 문을 만들지 말고, 배치식 착지점을 기대하며 단독 :label을 두지 마세요. 또한 루프, switch, trap 밖에서 break나 continue를 쓰지 마세요. PowerShell이 호출 스택을 타고 올라가 현재 런스페이스를 조용히 종료할 수 있어, 의도하지 않은 호출자까지 멈출 수 있습니다.
올바른 이동 방법 선택
| 목표 | 선호하는 방법 |
|---|---|
| 이름 있는 재사용 구간 실행 | function + 호출, 필요 시 return |
| 여러 옵션 중 선택 | if / elseif / else 또는 switch |
| 반복하거나 되돌아가기 | while, for, do, 또는 foreach |
| 중첩 루프에서 일찍 나가기 | 레이블이 지정된 break / continue |
| 전체 프로세스 종료 | exit (신중히) |
스크립트를 읽기 쉽게 유지하세요. 대부분의 “점프” 필요에는 function과 조건문을, 반복에는 루프를, 레이블은 중첩 루프 제어에만 쓰세요. 성능보다 나중에 유지보수할 때의 명확성과 분명한 종료 경로가 더 중요합니다.
FAQ
PowerShell에 goto가 있나요?
없습니다. cmd.exe 배치와 달리 PowerShell에는 goto 키워드가 없습니다. 공식 언어 키워드와 PowerShell 언어 사양은 흐름 제어로 break, continue, throw, return, exit를 나열하며 goto는 없습니다.
PowerShell 레이블은 무엇을 하나요?
레이블은 루프나 switch를 표시해 break / continue가 그것을 대상으로 삼게 합니다. 배치 :label 줄처럼 임의의 점프 목적지를 만들지 않습니다.
배치 GOTO의 일상적인 대안은 무엇인가요?
이름이 있는 지점에는 function을 호출하고, 분기와 반복에는 if / switch와 루프를 사용하세요. 중첩 루프에서 바깥쪽을 제어해 끝내야 할 때만 레이블이 지정된 break를 쓰세요.
이 기법들을 함께 쓸 수 있나요?
가능합니다. 메뉴 function은 종종 while 루프 안의 switch를 쓰고, 중첩 처리에서는 바깥 루프를 멈춰야 할 때 레이블이 지정된 break를 더합니다.
이 예제는 Windows PowerShell 5.1에서도 동작하나요?
여기에 보인 언어 기능은 동작합니다. 검증된 출력은 PowerShell 7.6.6에서 캡처했으며, Read-Host의 호스트 프롬프트 형식은 호스트에 따라 조금 다를 수 있습니다.