首页 文章

批处理文件:在嵌套for循环中调用goto后,for循环变量被删除

提问于
浏览
1

我正在尝试编写一个批处理文件,对于一组数字(1到10),它会按顺序启动可执行文件 . 数字集中的数字将传递到文件,以便可执行文件以批处理模式运行 . 但是,因为可执行文件占用了资源,所以我只想要一次运行这些可执行文件中的5个(总共将有1500个可执行文件运行) . 我用jimmy-rigged一些脚本来监视任务列表,并且当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.当等待循环循环时,Echo %% g给出回波%g .

我在这做错了什么?

先感谢您 .

1 回答

  • 0

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

    @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
    

    总是避免使用多行for循环体(或if if / else块),它们不值得调试它们所需的工作量 . 调用子程序是避免这些问题的最佳方法 .

相关问题