如何在批处理文件中执行另一个进程之前等待进程终止?假设我在执行notepad.exe
之前需要杀死一个进程wordpad.exe
。然后,当wordpad.exe
终止时,我需要再次启动notepad.exe
。我该怎么做?
答案 0 :(得分:77)
使用 start / w programname 等待程序名结束
START /W notepad
ECHO Back from notepad
START /W wordpad
ECHO Back from wordpad
START /W notepad
答案 1 :(得分:27)
尝试这样的事情......
@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
行不是必需的,但仅限于检查写字板是否仍在运行的频率。
答案 2 :(得分:18)
这是aphoria的答案的更新版本。
我用TASKKILL和TASKLIST替换了PSLIST和PSEXEC。由于它们看起来效果更好,我无法让PSLIST在Windows 7中运行。
还用TIMEOUT取代Sleep。
这是我需要的一切,以使脚本运行良好,并且所有添加内容都是由发布评论的伟大人员提供的。
此外,如果在.exe启动之前有延迟,则可能需要在:loop之前插入一个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
答案 3 :(得分:6)
我喜欢“START / W”的答案,但在我的情况下,我发现了一些更基本的东西。我的流程是控制台应用程序在我的无知中,我认为我需要一些特殊的BAT语法,以确保第一个在第二个开始之前完成。然而,BAT似乎区分了控制台应用程序和Windows应用程序,并且它们执行它们的方式略有不同。 OP显示窗口应用程序将作为BAT的异步调用启动。但是对于同步调用的控制台应用程序,在与BAT本身运行相同的命令窗口内。
对我来说,最好不要使用“START / W”,因为一切都可以在一个命令窗口内运行。关于“START / W”的烦人之处在于它会产生一个新的命令窗口来执行你的控制台应用程序。
答案 4 :(得分:1)
这有效,甚至更简单。如果删除ECHO-s,它将更小:
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
答案 5 :(得分:1)
'start / w'并非在所有情况下都有效。原始解决方案效果很好。但是,在某些计算机上,明智的做法是在启动可执行文件后立即放置延迟。否则,任务名称可能尚未出现在任务列表中,并且循环将无法按预期进行(有人指出)。可以将这两个延迟组合起来并放在循环的顶部。也可以摆脱“ else”只是为了缩短。依次运行的两个程序的示例:
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
john refling
答案 6 :(得分:0)
这是我改编的johnrefling的。 在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
答案 7 :(得分:-1)
call process1
call process2
在这种情况下,process2将在process1完成之后才开始。