::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 中启动。
答案 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
和|
的解释。