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