batch-file - 我如何等待循环 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因为我希望程序并行启动。
解决方案
这是此任务的一个解决方案:
@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
要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。
echo /?
endlocal /?
find /?
for /?
goto /?
set /?
setlocal /?
start /?
tasklist /?
timeout /?
另请参阅有关使用命令重定向运算符的Microsoft 文章,了解2>nul
and>nul
和|
。
推荐阅读
- javascript - 如何更改 spago 的节点堆栈限制?
- php - 其中 Laravel 5.8 问题
- javascript - 如何在 webdriverIO 测试中导入和使用静态 javascript 对象?
- d3.js - 单击时禁用 D3 缩放地图缩放到原始大小
- kubernetes - Kafka 连接被 Kubernetes 节点端口拒绝
- c - c 嵌入:使用定义的结构变量名称进行静态结构初始化
- visual-studio - TFS 2015 - 无法接受或拒绝代码审查响应
- excel - 原始电子邮件上的电子邮件戳
- laravel - 在 Laravel 中使用 for else 循环和紧凑函数时如何解决这个问题?
- ffmpeg - FFMPEG 可能的最佳质量图像提取