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
我正在尝试编写一个批处理文件来自动执行一些例行的 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