배치 파일에서 exe가 완료 될 때까지 어떻게 대기합니까?


43

sp1을 설치하기 위해 종료시 exe를 실행하는 스크립트를 만들려고합니다. 내 스크립트는 (실제 박쥐 스크립트가 아닌)와 비슷합니다.

If installed GOTO END
    Install.exe
END:

내 문제는 그것이 실행될 때 설치 프로그램을 시작한 다음 설치 프로그램이 다른 프로세스이기 때문에 스크립트를 완료하고 컴퓨터가 시스템을 종료하고 시스템을 종료하기 때문에 설치 프로세스를 종료하여 후속 작업을 수행한다는 것입니다 (최소한, 그것이 내가 생각하는 것입니다) 하고 있어요)

시작된 프로세스가 완료 될 때까지 기다렸다가 종료 할 수있는 방법이 있습니까?

답변:



23

한 가지 더 짧은 방법 :

Install.exe|more

또한

install|rem

더 결국에는 콘솔 출력을 잡을 수 있지만 사용할 수 있습니다. 이것이 작동하는 이유입니다. piped 명령은 .exe가 끝날 때까지 입력을 기다립니다.


그리고 왜 downlvote는?
npocmaka

이것은 우수하다! 나는 당신을 투표합니다.
Changwang Zhang

2
이것은 분명히 이긴다
Fnord

exe가 매개 변수를 사용하면 어떻게됩니까? 어떻게 작동할까요?
m4l490n

@ m4l490n-정상적으로 작동합니다. 리디렉션 및 조건부 실행 연산자 (배치 스크립트에 더 높은 우선 순위를 가지고 <, >, >>, &, &&, ||, |)
npocmaka

13

배치 파일에서 직접 exe를 호출하거나 사용 start /wait하면 작동하지만주의해야합니다.

호출 한 exe가 다른 exe를 호출하는 것과 같은 다른 프로세스를 생성 한 다음 종료하면 호출 된 exe가 종료 된 후에 배치 파일이 처리를 계속합니다. 시작된 다른 프로세스에 대한 지식이 없기 때문입니다.

귀하의 경우 설치 프로그램은 일반적으로 exe 자체에 포함될 수있는 압축 컨테이너 형식에서 파일을 추출 한 다음 추출 된 파일 중 하나를 종료하고 종료하기 때문에 실제 문제입니다. 일부 설치 관리자는 전체 설치가 완료 될 때까지 원본 exe가 종료되지 않도록 명령 줄 매개 변수를 제공하므로 조사하고자 할 수도 있습니다. 그 외에는 배치 파일만으로는이 문제를 해결할 수있는 방법이 없으며 프로그래밍 방식으로 해결해야합니다.


msiexec.exe (또는 무엇이든간에)가 실행 중인지 확인하기 위해 항상 종료 루틴에 루프를 추가 한 다음 기다렸다가 다시 루프 할 수 있습니다.
mfinni

@mfinni는 문제를 더욱 복잡하게 만들기 위해 msiexec종종 다른 프로세스를 시작합니다. :(
John Gardeniers

1
실제로 왜 start /wait필요한가? start /waitGUI (콘솔과 반대) 응용 프로그램이 완료 될 때까지 배치 파일을 차단 하는 데 사용해야한다고 생각했습니다 . 그러나 지금 테스트하면 배치 파일이 실제로 GUI 응용 프로그램을 기다리는 것으로 나타났습니다. 해당 질문을 게시했습니다. 왜 GUI 응용 프로그램이 배치 파일을 차단합니까?
Martin Prikryl

나는이 문제가 있었고 해결책을 해결책으로 추가했다.
FreeSoftwareServers 2016 년

5

다음은 MATLAB을 사용한 예입니다! MATLAB의 경로 설정이 완료되었고 FileName.m 파일에 의해 MATLAB 종료가 보장되는 것으로 가정했습니다 (또는 사용자가 내부적으로 지정 함).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit

2
Matlab이 저에게 조금 이상하다고 생각하면, 특히 여기에 serverfault가 있습니다.
Erik

이것은 MATLAB 이외의 다른 작업에 사용할 수 있습니다. "MATLAB.exe"를 다른 것으로 변경하십시오. 필터링 된 출력에서 ​​exe를 다시 검색하도록 두 번째 'find'를 수정하십시오.
Oliver Bock

1

@ John Gardeniers 문제가 있거나 설명했는데 내 exe가 다른 exe를 호출하고 종료되었으므로 start / wait가 작동하지 않았습니다. 나는 "while loop"를 만들어 실행 여부를 확인한 다음 완료되면 계속 진행합니다. 필요에 따라 시간을 조정할 수 있습니다.

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

0

start / wait 명령을 사용할 수 있습니다. 응용 프로그램을 시작하고 종료 될 때까지 기다립니다.

또는 실행하는 데 걸리는 시간을 알고 있으면 Windows Server 2003 Resource Kit Tools 에서 제공하는 sleep 명령을 살펴볼 수 있습니다 . Sleep.exe를 사용하면 배치 파일이 다른 항목을 설치하기 전에 프로그램이 완전히 설치 될 수 있도록 몇 초 동안 배치를 일시 중지 할 수 있습니다. 프로그램 자체가 다른 프로세스를 시작하기 때문에 "start / wait"구문을 무시하는 일부 프로그램이 있습니다. 그러면 sleep.exe가 매우 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.