首页 > 解决方案 > 我如何等待循环 1 完成然后开始循环 2

问题描述

::loop1
For /L %%A IN (1,1,15) DO (
start program1.exe  arg1 
)

::loop2
For /L %%A IN (1,1,15) DO (
start program2.exe  arg1 
)

我只想在循环 1 中的所有 15 个实例或 program1.exe 都完成执行后才运行 loop2。我不能使用call因为我希望程序并行启动。

标签: batch-file

解决方案


这是此任务的一个解决方案:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
for /L %%I in (1,1,15) do start "" program1.exe arg1

rem A real endless running loop is never a good designed loop.
rem For that reason use a second condition to exit the wait loop.
set "MaxSecondsToWait=60"

:WaitLoop
%SystemRoot%\System32\timeout.exe /T 1 /NOBREAK >nul
%SystemRoot%\System32\tasklist.exe /FI "IMAGENAME eq program1.exe" /NH 2>nul | %SystemRoot%\System32\find.exe /C "program1.exe" >nul
if errorlevel 1 goto NextLoop
set /A MaxSecondsToWait-=1
if not %MaxSecondsToWait% == 0 goto WaitLoop
echo Timeout for all started program1.exe exceeded.

:NextLoop
for /L %%I in (1,1,15) do start "" program2.exe arg1
endlocal

tasklist即使在可执行文件中也总是退出以0在无法找到的正在运行的任务列表中找到tasklist。出于这个原因,如果在输出中未找到区分大小写的搜索字符串,则过滤器的输出将tasklist被过滤器find退出,这意味着不再运行。1tasklistprogram1.exe

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • find /?
  • for /?
  • goto /?
  • set /?
  • setlocal /?
  • start /?
  • tasklist /?
  • timeout /?

另请参阅有关使用命令重定向运算符的Microsoft 文章,了解2>nuland>nul|


推荐阅读