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