批处理文件:在嵌套的 for 循环中调用 goto 后丢弃的 for 循环变量



我正在尝试编写一个批处理文件,对于一组数字(1 到 10),该文件按顺序启动可执行文件。数字集中的数字将传递到文件,以便可执行文件以批处理模式运行。但是,由于可执行文件占用资源,我一次只想运行其中的 5 个可执行文件(总共将运行 1500 个可执行文件)。我已经操纵了一些脚本来监视任务列表,并且在当前正在运行 5 个可执行文件时不再继续启动可执行文件。一旦任务数减少到 4,下一个可执行文件将启动。

简化的最小工作示例(我显然没有运行记事本):

FOR %%g IN (1 2 3 4 5 6 7 8 9) DO (
:loop
tasklist | find /I /C "OpenSees.exe" >process.txt
FOR /F "tokens=*" %%a IN (process.txt) DO (
IF "%%a" EQU "5" (goto :loop)
)           
start notepad.exe
PAUSE
)

这里发生的情况是,一旦 %%a 等于 5,就会调用 goto,并且循环工作正常并且不会启动更多可执行文件。但是,一旦关闭了一个"记事本",等待循环就会中断(按预期),但初始 FOR 循环也会中断(%%g 不再是定义的变量),并且脚本结束时没有 %%g 传递 5 到 6 7 8 和 9。回显 %%g 在等待循环循环时返回回显 %g。

我在这里做错了什么?

提前谢谢你。

我认为这可以解决您的问题:

@setlocal ENABLEEXTENSIONS
@set prompt=$G
@rem Change this to whatever program you want to run.
@set _programToRun=notepad.exe
@for %%g in (1 2 3 4 5 6 7 8 9) do @call :TaskMonitor %%g
@exit /b 0
:TaskMonitor
@tasklist | find /I /C "%_programToRun%" > process.txt
@set /p "_procCount=" < process.txt
@echo %%1==%1 _procCount==%_procCount%
@rem Uncomment the next line, remove this line and the one following the next.
@rem @if _procCount lss 5 (start %_programToRun% %1 & exit /b 0)
@if %_procCount% lss 5 (start %_programToRun% & exit /b 0)
@goto :TaskMonitor

始终避免多行循环体(或 if/else 块),它们只是不值得调试它们所需的努力。 调用子例程是避免这些问题的最佳方法。

最新更新