HOWTO · Batch

Windows 배치 파일에서 명령 또는 프로그램이 끝날 때까지 대기

Windows 배치 파일에서 명령을 순서대로 실행하고, 다른 배치 파일에는 CALL을, START로 시작한 프로그램에는 START "" /WAIT를, 단순 지연에는 TIMEOUT을 사용하세요.

이 페이지의 내용

배치 파일에서 직접 실행한 명령과 실행 파일은 cmd.exe가 다음 줄을 읽기 전에 끝납니다. 다른 배치 파일을 호출하거나 START로 프로그램을 의도적으로 시작할 때만 별도 명령을 사용하면 됩니다.

상황 사용할 방법
일반 명령 또는 실행 파일 직접 실행합니다. 명령이 반환된 뒤 다음 줄이 실행됩니다.
다른 .bat 또는 .cmd 파일 call child.cmd를 사용합니다. 자식 파일이 끝나면 부모 파일로 돌아옵니다.
START로 시작한 프로그램 start "" /wait program.exe로 START가 시작한 프로세스가 끝날 때까지 기다립니다.
정해진 지연 또는 사용자 확인 timeout 또는 pause를 사용합니다. 어느 쪽도 프로세스 완료 여부를 감지하지는 않습니다.

이 글에서는 각 상황에 맞는 방법과, 다음 명령이 값을 바꾸기 전에 종료 코드를 보존하는 방법을 설명합니다.

명령을 직접 실행하기

명령이나 실행 파일을 한 줄에 직접 실행할 때는 스크립트가 기다리도록 START를 덧붙일 필요가 없습니다. 첫 명령이 반환된 뒤 다음 명령이 실행됩니다. 다음 배치 파일은 내장 echo 명령으로 이 순서를 보여 줍니다.

@echo off
echo [1] command start
echo [2] command returned
[1] command start
[2] command returned

실행 파일을 직접 호출할 때도 같은 순서가 적용됩니다. 이후 단계에서 종료 코드가 필요하다면 해당 명령 바로 뒤에서 %ERRORLEVEL%을 저장하세요. 뒤이은 명령이 값을 바꿀 수 있습니다. 배치 파일에서 이미 저장한 결과를 반환하려면 exit /b %rc%를 사용합니다.

CALL로 다른 배치 파일 호출하기

배치 파일을 이름으로 실행하면 제어가 그 파일로 넘어갑니다. 부모 파일이 이후 작업을 계속해야 한다면 CALL을 사용하세요. 예를 들어 부모 파일에서 자식의 반환 코드를 즉시 저장할 수 있습니다.

parent.cmd:

@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
echo Processing "%~1"
exit /b

두 파일은 별도의 파일 예시이며 실제 실행한 테스트 사례는 아닙니다. Windows 배치에서 CALL은 자식 파일이 끝난 뒤 제어를 부모로 돌려보내며, 부모는 자식이 설정한 %ERRORLEVEL%을 읽을 수 있습니다. CALL 없이 다른 .bat 또는 .cmd 파일을 실행하면 해당 파일로 실행이 넘어가므로 부모의 이후 줄은 실행되지 않습니다. 인수는 자식 파일 이름 뒤에 전달하고, 공백이 포함된 인수는 따옴표로 묶으세요. 명령 형식과 반환 동작은 Microsoft의 call 문서에서 확인할 수 있습니다.

START로 시작한 프로그램 기다리기

별도의 프로그램을 의도적으로 시작할 때 START를 사용합니다. START가 시작한 프로세스가 끝날 때까지 기다리려면 /WAIT을 추가하세요.

start "" /wait "C:\Tools\My Program\worker.exe" --task import
set "rc=%ERRORLEVEL%"
echo worker exit code: %rc%
exit /b %rc%

이 Windows 전용 명령은 문법을 보여 주는 예시입니다. 외부 실행 파일은 여기에 포함되어 있지 않으므로 실행 결과를 주장하지 않습니다. 빈 ""은 창 제목입니다. START는 따옴표로 묶인 첫 인수를 제목으로 처리하므로, 따옴표로 묶은 실행 파일 경로보다 앞에 제목을 지정해야 합니다. /B는 선택 사항이며 콘솔 프로그램을 현재 명령 프롬프트 창에서 실행하게 할 뿐, 기다리게 하지는 않습니다. 시작한 프로세스가 끝날 때까지 기다렸다가 반환하는 옵션은 /WAIT입니다.

START /WAIT은 자신이 시작한 프로세스를 기다립니다. 시작 프로그램이 별도로 분리된 자식 프로세스를 실행하는 경우, 그 자식의 모든 작업이 끝났다고 보장하지는 않습니다. 이 차이가 중요하다면 해당 프로그램의 문서를 확인하세요. 전체 옵션은 Microsoft의 start 문서, 다른 시작 패턴은 배치 파일에서 START 명령 사용하기를 참고하세요.

TIMEOUT과 PAUSE는 완료 확인이 아닙니다

다른 프로세스가 끝났다는 증거로 TIMEOUT을 사용하지 말고, 의도적으로 일정 시간 지연할 때 사용하세요. Microsoft 문서에 따르면 /NOBREAK은 일반 키 입력으로 카운트다운을 건너뛰지 못하게 하고, TIMEOUT /T -1은 키를 누를 때까지 기다립니다. 대화형 입력을 기다릴 때는 PAUSE도 사용할 수 있습니다. Windows TIMEOUT은 -1부터 99999초까지의 값을 허용합니다. 지연 시간이 너무 짧거나 불필요하게 길 수 있으므로, 프로세스 완료가 조건이라면 CALL 또는 START "" /WAIT을 사용하세요.

시간 지연 옵션과 예시는 배치 파일에서 TIMEOUT 사용하기를 참고하세요.

문제 해결

  • 일반적인 START /WAIT 대안으로 프로세스 이름을 반복해서 확인하는 루프를 사용하지 마세요. 같은 이름을 쓰는 프로세스가 여러 개일 수 있고, 시작 프로그램이 분리된 자식 프로세스보다 먼저 반환할 수도 있습니다.
  • 확인하려는 명령 직후에 %ERRORLEVEL%을 읽으세요. echo, set 또는 뒤이은 명령이 값을 바꿀 수 있습니다.
  • 자동화 예제에 cmd /k를 추가하지 마세요. 스크립트 완료 여부를 알리는 대신 명령 프롬프트를 의도적으로 계속 열어 둡니다.
  • 프로그램에 관리자 권한, 사용자 입력, 네트워크 접근 또는 프로그램별 완료 신호가 필요하다면, 명령 프로세스를 기다리는 것만으로 충분한지는 해당 프로그램의 문서를 확인해야 합니다.

요약

일반 명령은 직접 실행하세요. 호출한 곳으로 돌아와야 하는 다른 배치 파일에는 CALL을 사용하고, START로 프로그램을 실행할 때는 START "" /WAIT을 사용하세요. TIMEOUT과 PAUSE는 배치 파일을 잠시 멈추지만 프로그램 완료 여부를 알려 주지는 않습니다.