HOWTO · Batch
Windows 배치 파일에서 명령 또는 프로그램이 끝날 때까지 대기
다른 배치 파일에는 CALL, START로 시작한 프로그램에는 START "" /WAIT, 단순 지연에는 TIMEOUT을 사용합니다.
배치 파일에서 직접 실행한 명령과 실행 파일은 보통 cmd.exe가 다음 줄을 읽기 전에 끝납니다. 다른 배치 파일을 호출하거나 START로 프로그램을 의도적으로 시작한 경우에만 별도 방식을 선택합니다.
| 상황 | 사용할 방법 |
|---|---|
| 일반 명령 또는 실행 파일 | 직접 실행 |
다른 .bat 또는 .cmd 파일 |
call child.cmd |
START로 시작한 프로그램 |
start "" /wait program.exe |
| 고정 지연 또는 사용자 확인 | timeout 또는 pause |
명령을 직접 실행하기
다음 단계에서 결과가 필요하면 %ERRORLEVEL%을 바로 저장합니다.
@echo off
echo [1] ping start
ping 127.0.0.1 -n 2 >nul
set "rc=%ERRORLEVEL%"
echo [2] ping end: exit code=%rc%
exit /b %rc%
출력 순서는 다음과 같습니다.
[1] ping start
[2] ping end: exit code=0
두 번째 줄은 ping이 반환된 뒤 실행됩니다. TIMEOUT은 완료를 확인하지 않고 정해진 시간만 기다립니다. exit /b %rc%는 저장한 종료 코드를 호출한 배치 파일 또는 명령 프롬프트에 전달합니다.
CALL로 다른 배치 파일 호출하기
CALL 없이 배치 파일 이름을 실행하면 제어가 그 파일로 넘어가 부모 파일의 뒤쪽 줄은 계속되지 않습니다. CALL은 자식이 끝난 뒤 부모로 돌아옵니다.
@echo off
echo [parent] before call
call child.cmd input.txt
set "rc=%ERRORLEVEL%"
echo [parent] after call: exit code=%rc%
exit /b %rc%
child.cmd:
@echo off
echo [child] start
ping 127.0.0.1 -n 2 >nul
echo [child] end
exit /b 7
부모는 자식이 끝난 뒤에만 제어를 다시 받습니다.
[parent] before call
[child] start
[child] end
[parent] after call: exit code=7
인수는 파일 이름 뒤에 쓰며 공백이 있는 인수는 따옴표로 묶습니다. 자세한 규칙은 Microsoft의 call 문서를 참조하세요.
START로 시작한 프로그램 기다리기
START를 선택해 별도 프로그램을 시작한 경우에는 /WAIT을 추가합니다.
start "" /b /wait "C:\Tools\My Program\worker.exe" --task import
set "rc=%ERRORLEVEL%"
echo worker finished: %rc%
exit /b %rc%
종료 코드 9로 끝나는 테스트 프로그램을 사용하면 종료 뒤의 예상 출력은 다음과 같습니다.
worker finished: 9
첫 번째 빈 ""는 창 제목입니다. START는 첫 번째 따옴표 인수를 제목으로 해석하므로 공백이 있는 실행 파일 경로 앞에 필요합니다. /B는 콘솔을 현재 창에 유지할 뿐이고, 기다리는 옵션은 /WAIT입니다. /WAIT은 시작한 프로세스만 기다리며, 그 프로그램이 따로 분리해 만든 자식 프로세스까지 보장하지는 않습니다. 옵션은 Microsoft의 start 문서와 START 사용법에 설명되어 있습니다.
TIMEOUT과 PAUSE는 완료 확인이 아닙니다
timeout /t 30은 30초를 기다리고 pause는 키 입력을 기다립니다. 둘 다 프로그램이 끝났다는 증거가 아닙니다. /NOBREAK은 일반 키로 카운트다운을 건너뛰는 것을 막고, timeout /t -1은 키 입력까지 기다립니다. 완료가 조건이면 CALL 또는 START "" /WAIT을 사용하고, 의도적인 지연은 TIMEOUT 사용법을 참조하세요.
문제 해결
- 프로세스 이름을 반복 확인하는 루프를
START /WAIT의 일반적인 대안으로 사용하지 마세요. 여러 프로세스가 같은 이름을 쓸 수 있고, 시작 프로그램은 분리된 자식 프로세스가 끝나기 전에 반환할 수 있습니다. - 관심 있는 명령 바로 뒤에서
%ERRORLEVEL%을 읽으세요.echo,set및 뒤따르는 명령이 값을 바꿀 수 있습니다. - 자동화 예제에
cmd /k를 넣지 마세요. 스크립트가 끝났는지 보고하는 대신 명령 프롬프트를 의도적으로 열어 둡니다. - 프로그램에 관리자 권한, 사용자 입력, 네트워크 접근 또는 프로그램 고유의 완료 신호가 필요하다면, 명령 프로세스를 기다리는 것만으로 충분한지는 해당 프로그램 문서가 결정합니다.
요약
일반 명령은 직접 실행하세요. 호출한 곳으로 돌아와야 하는 다른 배치 파일에는 CALL을 사용하고, START로 프로그램을 시작할 때만 START "" /WAIT을 사용하세요. TIMEOUT과 PAUSE는 배치 파일을 멈추지만 프로그램 완료 여부를 알려 주지는 않습니다.