For 循环中的 %%G 从索引更改为 %G 使用

%%G from For Loop changing from index to %G using

我正在尝试编写一个批处理文件来自动执行一些例行的 Matlab 过程。批处理文件使用 For /L 结构从 0 循环到设定值(通常在 50 到 75 之间)。该脚本将主 Matlab 脚本复制到子文件夹并运行它。批处理通常会继续进行,所以我放了一个 :loop 等待 Matlab 结束。

echo off
setlocal EnableDelayedExpansion

REM The format is matlab_auto.in (max value). 
For /L %%G in (0,1,%1) do (
REM Sanity check
echo 1 %%G

REM Create Outputs folder if non-existent
if not exist Outputs md Outputs

REM Copy .m file into deg folder and cd to folder
copy values_calc.m %%Gsort\values_calc.m
cd %%Gsort
echo Got to folder

    REM Running .m script and sanity check
echo 2 %%G
matlab -nosplash -nodesktop -noFigureWindows -logfile output.log -r "run('values_calc.m');"
echo 3 %%G

REM Waiting for matlab to finish
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
echo 4 %%G
if errorlevel 1 goto loop
echo Finished Matlab  
echo 5 %%G

REM Copy .m outputs into outputs folder, ignoring confirmation
copy Output_*.* ..\Outputs /Y
echo Copied outputs 

REM Sanity check and return home
echo 6 %%G
cd %~dp0
echo Home again

)

我遇到的问题是当它在 For 循环的第一次迭代后结束时。 Echo 1、2、3 为 0。Echo 4 第一次通过 :loop 显示 0,但随后在循环的其余部分以及 Echos 5 和 6 处显示 %G。它也不会继续进入 For 循环的进一步迭代.我假设这是因为 %%G 不再是数字(或在指定范围内)。

我已经尝试实现调用子例程以在循环外使用 goto,但随后它打开了 Matlab 数十次,导致计算机崩溃。

如有任何见解或建议,我们将不胜感激。谢谢。

编辑:将用于评论的 :: 更改为 REM。它没有解决这个问题,但看起来更好。

编辑 2:我有一个演示问题的测试用例。它与 :loop 或 goto 有关。 回声 setlocal EnableDelayedExpansion

for /l %%G in (0,1,5) do (
    :loop
    echo %%G
    pause
    if %%G==0 goto loop
)

是的。 GOTO 命令的执行 取消 任何活动的(未决的)FOR 或 IF 命令,这些命令可能嵌套在任何级别的括号内。这样,放置在 :loop 标签下面的命令第一次在 FOR 上下文 中执行 ,但在 goto 命令之后,它们的执行就好像它们是放在 FOR 循环之外!解决这个问题的方法是将标签下面的代码提取到一个子程序中,然后在FOR.

call :loop
echo off
setlocal EnableDelayedExpansion

REM The format is matlab_auto.in (max value). 
For /L %%G in (0,1,%1) do (
   REM Sanity check
   echo 1 %%G

   REM Create Outputs folder if non-existent
   if not exist Outputs md Outputs

   REM Copy .m file into deg folder and cd to folder
   copy values_calc.m %%Gsort\values_calc.m
   cd %%Gsort
   echo Got to folder

   REM Running .m script and sanity check
   echo 2 %%G
   matlab -nosplash -nodesktop -noFigureWindows -logfile output.log -r "run('values_calc.m');"
   echo 3 %%G

   REM Waiting for matlab to finish
   call :loop
   echo Finished Matlab  
   echo 5 %%G

   REM Copy .m outputs into outputs folder, ignoring confirmation
   copy Output_*.* ..\Outputs /Y
   echo Copied outputs 

   REM Sanity check and return home
   echo 6 %%G
   cd %~dp0
   echo Home again

)
goto :EOF

:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
REM echo 4 %%G
if errorlevel 1 goto loop
exit /B