我如何等待循环一结束然后开始循环2

时间:2020-03-05 17:38:42

标签: batch-file

::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 
)

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

1 个答案:

答案 0 :(得分:1)

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

@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过滤,如果在1的输出中找不到区分大小写的搜索字符串,则以tasklist退出。不再运行program1.exe

要了解所使用的命令及其工作方式,请打开command prompt窗口,在其中执行以下命令,并非常仔细地阅读每个命令显示的所有帮助页面。

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

另请参阅Microsoft关于Using command redirection operators的文章,以获取2>nul>nul|的解释。