2011-11-18 40 views
27

如何在批处理文件中执行另一个进程之前等待进程终止?假设我有一个进程notepad.exe,我需要在执行wordpad.exe之前杀死。然后,当wordpad.exe终止时,我需要再次启动notepad.exe。我怎么做?如何等待进程终止以在批处理文件中执行另一个进程

+0

@sarnold问题是,Win32是... Win32。有些程序(如写)会从父进程中分离*,而其他程序(如记事本)则不会。 – 2011-11-18 04:39:22

+0

@pst:我以为你不得不专门用'start'去支队......哦,哇。那太糟了_。 – sarnold

+0

@sarnold糟糕:记事本不分离,写入。这与写程序有关,不一定是Win32,尽管很多UI程序(不打算从shell调用)似乎都是这样工作的。我相当确定'CreateProcess'是相关的。 – 2011-11-18 04:42:19

回答

18

尝试这样的事情......

@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 
    SLEEP 5 
    GOTO LOOP 
) 

:CONTINUE 
NOTEPAD 

我用PSLISTPSEXEC,但你也可以使用TASKKILLTASKLIST>nul 2>&1只是为了隐藏所有来自PSLIST的输出。 SLEEP 5行不是必需的,但它只是限制您检查写字板是否仍在运行的频率。

+0

TASKLIST不会以这种方式接收参数。我怎样才能使用任务列表? –

+10

它看起来像'TASKLIST'不设置'ERRORLEVE'。作为解决方法,您可以通过'FIND'管道输出'TASKLIST'。像这样的东西,'TASKLIST |找到/我“写字板”'。 – aphoria

+2

这很弱。使用'开始/等待'就像自然的意图。 –

55

使用启动/ W PROGRAMNAME等待PROGRAMNAME

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

这比完整的批次要简单得多,而且完美地工作。请注意,如果为程序名称使用引号,则需要添加* title *参数。有关更多信息,请参阅'help start'。 –

+1

比接受的答案好得多 –

+0

其实,为什么你需要'start/w'?我自己认为需要使用'start/w'来阻止批处理文件,直到GUI(与控制台相对)应用程序完成。但现在测试它,我发现批处理文件实际上等待着GUI应用程序。我发布了相应的问题:[为什么GUI应用程序阻止批处理文件?](http://stackoverflow.com/questions/19381082/why-gui-application-blocks-a-batch-file) –

5

结束时,我喜欢的 “START/W” 的答案,但我的情况,我发现更基本的东西。我的进程是控制台应用程序而在我的无知中,我认为我需要一些BAT语法中特别的东西来确保第一个在第二个开始之前完成。然而,英美烟草公司似乎在控制台应用程序和Windows应用程序之间作了区分,并且它们执行方式稍有不同OP显示窗口应用程序将作为来自BAT的异步调用启动。但对于同步调用的控制台应用程序,在与BAT本身运行相同的命令窗口内。

对我来说,实际上最好不要使用“START/W”,因为一切都可以在一个命令窗口内运行。关于“START/W”的烦人之处在于它会产生一个新的命令窗口来执行您的控制台应用程序。

+4

使用开关/ B,它将在同一窗口中执行。 – Uhlen

+1

啊我明白了。但是,直接调用“My.exe”与“START/B My.exe”是否有区别?这似乎是同样的事情。 –

10

这是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 
+2

非常好。经过测试并在Windows 7,8,10上运行。 – Damien

+3

这不是我答案的“更新”版本。这是我的答案的一个副本,只是用'TASKKILL'和'TASKLIST'替换'PSLIST'和'PSEXEC',我在我的答案中列出了替代方案。 – aphoria

+1

谢谢。最好的答案是,如果该进程恰好产生额外的进程,因为/等待解决方案无法工作。简单地使用类似的代码来解决这些情况。 – Robert

-1
call process1 
call process2 
在这种情况下,进程2才会开始过程1完成

+0

你应该更仔细地阅读问题(和评论)。在第一条评论中,解释了为什么'CALL'不是一个通用的解决方案 – jeb

相关问题