Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab %%G from For循环使用从索引更改为%G_Matlab_Batch File_Batch Processing - Fatal编程技术网

Matlab %%G from For循环使用从索引更改为%G

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

我正试图编写一个批处理文件来自动化一些常规的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循环的第一次迭代之后结束时。回声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。非常感谢。