Matlab:从命令行运行m文件

时间:2011-07-11 21:44:54

标签: matlab command-line automation

假设;

我在位置有一个m文件:
C:\M1\M2\M3\mfile.m

matlab的exe文件位于此位置:
C:\E1\E2\E3\matlab.exe

我想从命令行使用Matlab运行这个m文件,例如在.bat文件中。我怎么能这样做,有办法吗?

9 个答案:

答案 0 :(得分:91)

这样的命令成功运行m文件:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');"

答案 1 :(得分:65)

我认为前面答案中没有提到的一个重点是,如果没有明确指出,matlab解释器将保持开放状态。 因此,在@hkBattousai的答案中,我将添加exit命令:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"

答案 2 :(得分:37)

Here is what I would use instead, to gracefully handle errors from the script:

C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

If you want more verbosity:

C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch me, fprintf('%s / %s\n',me.identifier,me.message), end, exit"

I found the original reference here.

答案 3 :(得分:24)

在Linux上你也可以这样做,你实际上可以向shell发回一个自定义错误代码,如下所示:

#!/bin/bash
matlab -nodisplay -nojvm -nosplash -nodesktop -r \ 
      "try, run('/foo/bar/my_script.m'), catch, exit(1), end, exit(0);"
echo "matlab exit code: $?"

如果脚本抛出异常,则打印matlab exit code: 1,否则为matlab exit code: 0

答案 4 :(得分:13)

以下是步骤:

  1. 启动命令行。
  2. 使用cd C:\M1\M2\M3
  3. 输入包含.m文件的文件夹
  4. 运行以下内容:C:\E1\E2\E3\matlab.exe -r mfile
  5. Windows系统将使用当前文件夹作为MATLAB搜索.m文件的位置,-r选项会在启动时尝试启动给定的.m文件

答案 5 :(得分:7)

感谢马拉特。你的comment帮助了我。 但我想添加我的try-catch块,因为我发现MExeption方法getReport()返回整个错误消息并将其打印到matlab控制台。

另外我打印了文件名,因为这个编译是调用matlab的批处理脚本的一部分。

try
    some_code
    ...
catch message
    display(['ERROR in file: ' message.stack.file])
    display(['ERROR: ' getReport(message)])
end;

对于传递给遗留代码生成方法的错误模型名称,输出将如下所示:

ERROR in file: C:\..\..\..
ERROR: Undefined function or variable 'modelname'.

Error in sub-m-file (line 63)
legacy_code( 'slblock_generate', specs, modelname);

Error in m-file (line 11)
sub-m-file

Error in run (line 63)
evalin('caller', [script ';']);

最后,要在Windows命令提示符窗口中显示输出,只需将matlab控制台记录到包含-logfile logfile.txt的文件(另外使用-wait)并调用批处理命令type logfile.txt < / p>

答案 6 :(得分:3)

自R2019b起,有一个新的命令行选项-batch。它代替了-r,不再建议使用。它还统一了跨平台的语法。例如,请参见the documentation for Windows,对于其他平台,说明相同。

matlab -batch "statement to run"

这将在没有桌面或启动屏幕的情况下启动MATLAB,将所有输出记录到stdoutstderr,在语句完成时自动退出,并提供报告成功或错误的退出代码。

因此,不再需要在代码周围使用try / catch来运行,也不再需要添加exit语句。

答案 7 :(得分:1)

我在bash脚本中运行此命令,尤其是提交SGE作业和批处理工作:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m

答案 8 :(得分:0)

由于所有答案都没有提供输入参数的信息,因此 在这里添加。经过研究,我发现了这个link

提供参数与我们运行Matlab函数的方式非常相似。

matlab -r 'try myfunction(argument1,argument2); catch; end; quit'

如果您以某种方式从bash / terminal获取参数,则只需将其插入到bash命令中,如下所示:

matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'

(这是经过反复试验的结果)