Matlab %%G from For循环使用从索引更改为%G
我正试图编写一个批处理文件来自动化一些常规的Matlab过程。批处理文件使用For/L结构从0循环到设置值(通常在50到75之间)。该脚本将主Matlab脚本复制到子文件夹并运行它。批处理通常会继续进行,因此我放置了一个:循环,以等待Matlab结束Matlab %%G from For循环使用从索引更改为%G,matlab,batch-file,batch-processing,Matlab,Batch File,Batch Processing,我正试图编写一个批处理文件来自动化一些常规的Matlab过程。批处理文件使用For/L结构从0循环到设置值(通常在50到75之间)。该脚本将主Matlab脚本复制到子文件夹并运行它。批处理通常会继续进行,因此我放置了一个:循环,以等待Matlab结束 echo off setlocal EnableDelayedExpansion REM The format is matlab_auto.in (max value). For /L %%G in (0,1,%1) do ( REM San
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循环的第一次迭代之后结束时。回声1、2、3为0。Echo 4在第一次通过:循环时显示0,但在其余循环以及Echo 5和6时显示%G。它也不会继续到For循环的进一步迭代中。我假设这是因为%%G不再是一个数字(或在指定的范围内)
我曾经尝试过实现一个调用子程序,在循环外使用goto,但是它多次打开Matlab,导致计算机崩溃
任何见解或建议都将不胜感激。多谢各位
编辑:将用于评论的::更改为REM。它没有解决此问题,但看起来更好
编辑2:我有一个演示问题的测试用例。它与循环或转到有关。
回音
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
我不经意间知道,
for
循环绝对讨厌:
作为注释。尝试用REM
命令替换它们。这非常有效。当我之前尝试使用一个子例程时,我没有exit/B或goto:EOF。非常感谢。