等待进程在Windows批处理文件中结束

时间:2014-03-21 12:31:42

标签: batch-file

我想编写一个Windows脚本,在执行某些操作之前等待给定进程(PID)结束。到目前为止,我有(PID = 1234):

:loop
set VAR="tasklist | find /i " 1234 " /c"
if NOT (' %VAR% ')=="0" goto loop
**do something**

但已经是

行了
set VAR="tasklist | find /i " 1234 " /c"

不起作用,它存储字符串而不是评估。或许它应该是?在哪种情况下行

if NOT (' %VAR% ')=="0" goto loop

应评估VAR的内容,但如果我在控制台中手动输入,我只需

"tasklist | find /i " was unexpected

我理解

中的双引号
set VAR="tasklist | find /i " 1234 " /c"

是有问题的,但我需要在PID的每一侧有一个空格(示例中为1234),以确保它不是另一个进程的子串(如12345),以使其正常工作。

那里有DOS专家吗?

3 个答案:

答案 0 :(得分:5)

:loop
tasklist | find " 1234 " >nul
if not errorlevel 1 (
    timeout /t 10 >nul
    goto :loop
)

获取列表,搜索内容,如果找到(找不到errorlevel = 1)等待并循环

将数据输入变量

for /f %%a in ('tasklist ^| find /c " 1234 "') do set "var=%%a"

答案 1 :(得分:1)

您可以结合任务列表查找来检查具有给定pid的进程是否正在运行。

然后,您可以循环此检查以等待给定的pid

 :waitforpid
 tasklist /fi "pid eq %1" 2>nul | find "%1" >nul
 if %ERRORLEVEL%==0 (
   timeout /t 2 /nobreak >nul
   goto :waitforpid
 )
 goto :eof

编辑:添加了一些睡眠

并将其用作

 call :waitforpid 1234

答案 2 :(得分:1)

@echo off
setlocal enabledelayedexpansion
:check
set stillalive=no
for /f "tokens=2" %%a in ('tasklist') do (
set pid=%%a
if !pid! == 1234 (
set stillalive=yes
)
)
if %stillalive% == yes (
cls
 echo/Oh! He's still there, I'll wait.
 goto check
) else (
 echo/He's not there anymore, start the party!!
)