Matlab:从命令行运行m文件

hkB*_*sai 101 matlab command-line automation

假设;

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

和matlab的exe文件在这个位置:
C:\E1\E2\E3\matlab.exe

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

hkB*_*sai 101

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

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

  • 如果你在最后添加"exit"命令以使你的答案更实用和有用,那将是很好的. (5认同)
  • 如果你想传递参数怎么办? (5认同)
  • "run"命令中及其周围的单引号和双引号很重要! (3认同)

ela*_*ell 70

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

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

  • 出于某种原因,如果`mfile.m`触发错误,则永远不会调用显式的`exit`函数,使整个进程等待... (7认同)

mal*_*lat 40

以下是我将使用的方法,优雅地处理脚本中的错误:

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

如果你想要更多详细内容:

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"
Run Code Online (Sandbox Code Playgroud)

我在这里找到了原始参考.


slu*_*x83 26

在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: $?"
Run Code Online (Sandbox Code Playgroud)

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

  • 要显示错误而不是MATLAB捕获错误,只需执行““尝试,运行('/foo/bar/my_script.m'),捕获e,disp(getReport(e)),退出(1),结束,退出(0);“` (3认同)

aar*_*rkk 13

以下是步骤:

  1. 启动命令行.
  2. 输入包含.m文件的文件夹 cd C:\M1\M2\M3
  3. 运行以下命令: C:\E1\E2\E3\matlab.exe -r mfile

Windows系统将使用您当前的文件夹作为MATLAB搜索.m文件的位置,该-r选项会在启动时尝试启动给定的.m文件.


小智 12

cat 1.m | matlab -nodesktop -nosplash
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu


Can*_*anO 8

感谢malat.你的评论帮助了我.但我想加我try-catch块,因为我找到了MExeption方法getReport()返回整个错误消息,并打印到控制台MATLAB.

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

try
    some_code
    ...
catch message
    display(['ERROR in file: ' message.stack.file])
    display(['ERROR: ' getReport(message)])
end;
Run Code Online (Sandbox Code Playgroud)

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

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 ';']);
Run Code Online (Sandbox Code Playgroud)

最后,要在Windows命令提示符窗口中显示输出,只需将matlab控制台记录到一个文件中-logfile logfile.txt(另外使用-wait)并调用batch命令type logfile.txt


Cri*_*ngo 8

从 R2019b 开始,有一个新的命令行选项-batch. 它取代了-r不再推荐的 。它还统一了跨平台的语法。例如请参阅Windows 的文档,对于其他平台,说明相同。

matlab -batch "statement to run"
Run Code Online (Sandbox Code Playgroud)

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

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