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

时间:2015-11-21 03:17:52

标签: 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 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在第一次通过时显示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
)

1 个答案:

答案 0 :(得分:2)

是。执行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