Как ждать завершения процесса для выполнения другого процесса в командном файле - PullRequest
37 голосов
/ 18 ноября 2011

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

Ответы [ 6 ]

79 голосов
/ 20 ноября 2011

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

START /W notepad
ECHO Back from notepad  
START /W wordpad
ECHO Back from wordpad
START /W notepad
30 голосов
/ 18 ноября 2011

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

@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.

18 голосов
/ 11 мая 2015

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

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

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

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

Также, если перед запуском .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
6 голосов
/ 18 июня 2013

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

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

1 голос
/ 06 февраля 2019

Это работает и еще проще. Если вы удалите 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
0 голосов
/ 30 января 2018
call process1
call process2

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...