Подтвердить что ты не робот

Как дождаться завершения процесса для выполнения другого процесса в пакетном файле

Как ждать завершения процесса перед выполнением другого процесса в пакетном файле? Скажем, у меня есть процесс notepad.exe, который мне нужно убить перед выполнением wordpad.exe. Затем, когда wordpad.exe завершается, мне нужно снова запустить notepad.exe. Как это сделать?

4b9b3361

Ответ 1

Попробуйте что-то вроде этого...

@ECHO OFF

PSKILL NOTEPAD

START "" "C:\Program Files\Windows NT\Accessories\wordpad.exe"

:LOOP
PSLIST wordpad >nul 2>&1
IF ERRORLEVEL 1 (
  GOTO CONTINUE
) ELSE (
  ECHO Wordpad is still running
  TIMEOUT /T 5
  GOTO LOOP
)

:CONTINUE
NOTEPAD

Я использовал PSLIST и PSEXEC, но вы также можете использовать TASKKILL и TASKLIST. >nul 2>&1 просто для того, чтобы скрыть весь вывод из PSLIST. Строка SLEEP 5 не обязательна, но предназначена только для ограничения частоты проверки того, работает ли WordPad.

Ответ 2

Используйте start/w programname, чтобы дождаться окончания имени программы

START /W notepad
ECHO Back from notepad  
START /W wordpad
ECHO Back from wordpad
START /W notepad

Ответ 3

Это обновленная версия ответа aphoria.

Я заменил PSLIST и PSEXEC на TASKKILL и TASKLIST`. Поскольку они, кажется, работают лучше, я не мог заставить PSLIST работать в Windows 7.

Также замените Sleep с TIMEOUT.

Это было все, что мне нужно, чтобы запустить script, и все дополнения были предоставлены замечательными парнями, разместившими комментарии.

Также, если задержка перед запуском .exe, возможно, стоит вставить Timeout перед циклом:.

@ECHO OFF

TASKKILL NOTEPAD

START "" "C:\Program Files\Windows NT\Accessories\wordpad.exe"

:LOOP
tasklist | find /i "WORDPAD" >nul 2>&1
IF ERRORLEVEL 1 (
  GOTO CONTINUE
) ELSE (
  ECHO Wordpad is still running
  Timeout /T 5 /Nobreak
  GOTO LOOP
)

:CONTINUE
NOTEPAD

Ответ 4

Мне понравился ответ "START/W" , хотя для моей ситуации я нашел что-то еще более основное. Мои процессы были консольными приложениями. И по моему невежеству я думал, что мне понадобится что-то особенное в синтаксисе BAT, чтобы убедиться, что 1-й закончен до начала второго. Однако BAT, похоже, делает различие между консольными приложениями и приложениями Windows, и он выполняет их несколько иначе. OP показывает, что оконные приложения будут запускаться как асинхронный вызов из BAT. Но для консольных приложений, которые вызывают синхронно, внутри того же командного окна, что и сам BAT.

Для меня было бы лучше не использовать "START/W" , потому что все могло работать внутри одного командного окна. Досадная вещь о "START/W" заключается в том, что она создаст новое командное окно для запуска вашего консольного приложения.

Ответ 5

Это работает и еще проще. Если вы удалите ECHO, он будет еще меньше:

REM
REM DEMO - how to launch several processes in parallel, and wait until all of them finish.
REM

@ECHO OFF
start "!The Title!" Echo Close me manually!
start "!The Title!" Echo Close me manually!
:waittofinish
echo At least one process is still running...
timeout /T 2 /nobreak >nul
tasklist.exe /fi "WINDOWTITLE eq !The Title!" | find ":" >nul
if errorlevel 1 goto waittofinish
echo Finished!
PAUSE

Ответ 6

'start/w' не работает во всех случаях. Оригинальное решение прекрасно работает. Однако на некоторых машинах целесообразно отложить задержку сразу после запуска исполняемого файла. В противном случае имя задачи может еще не появиться в списке задач, и цикл не будет работать должным образом (кто-то указал на это). 2 задержки могут быть объединены и размещены в верхней части цикла. Можно также избавиться от "другого" просто сократить. Пример двух последовательных программ:

c:\prog1.exe 
:loop1
timeout /t 1 /nobreak >nul 2>&1
tasklist | find /i "prog1.exe" >nul 2>&1
if errorlevel 1 goto cont1
goto loop1
:cont1

c:\prog2.exe
:loop2
timeout /t 1 /nobreak >nul 2>&1
tasklist | find /i "prog2.exe" >nul 2>&1
if errorlevel 1 goto cont2
goto loop2
:cont2

джон рефлинг

Ответ 7

Это моя адаптация Джонрефлинга. Эта работа также в WindowsXP; в моем случае я запускаю то же самое приложение в конце, потому что я хочу открыть его с другими параметрами. Мое приложение - WindowForm.NET

@echo off
taskkill -im:MyApp.exe
:loop1
tasklist | find /i "MyApp.exe" >nul 2>&1
if errorlevel 1 goto cont1
echo "Waiting termination of process..."
:: timeout /t 1 /nobreak >nul 2>&1      ::this don't work in windows XP
:: from: https://stackoverflow.com/questions/1672338/how-to-sleep-for-five-seconds-in-a-batch-file-cmd/33286113#33286113
typeperf "\System\Processor Queue Length" -si 1 -sc 1 >nul s
goto loop1
:cont1
echo "Process terminated, start new application"
START "<SYMBOLIC-TEXT-NAME>" "<full-path-of-MyApp2.exe>" "MyApp2-param1" "MyApp2-param2"
pause

Ответ 8

call process1
call process2

в этом случае process2 не начнется, пока не завершится process1.