Matlab:从命令行运行m文件


Answers:


106

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

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


另一个类似的问题在这里回答:stackoverflow.com/questions/25102699/...
Eghbal

6
如果您在末尾添加“ exit”命令以使答案更加实用和有用,那将是很好的。
卡姆兰·比格德利

3
“ run”命令中及其前后的单引号和双引号很重要!
Kamran Bigdely 2015年

5
如果您想传递参数怎么办?

Windows版本是否支持-nodesktop选项?我以为不是,但可能是错误的。
TerjeSandstrøm18年

70

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

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


7
由于某种原因,如果mfile.m触发错误,exit则永不调用显式函数,从而使整个过程处于等待状态
malat 2015年

41

这是我将用来妥善处理脚本错误的方法:

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

如果您需要更多详细信息:

"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"

我在这里找到了原始参考。由于原始链接现在不见了,因此这里是到今天仍然有效的备用新阅读器的链接:


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: $?"

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


3
要显示错误"try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
如未

13

步骤如下:

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

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


1
它不会在.bat文件中运行。我举了一个例子。实际上,我将通过Win32 API函数运行它CreateProcessW()
hkBattousai 2011年


8

感谢马拉特。您的评论对我有所帮助。但我想加我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),然后调用batch命令type logfile.txt


4

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

matlab -batch "statement to run"

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

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


2

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

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

0

由于所有答案都没有提供输入参数的信息,因此在此处添加它很重要。经过研究,我发现了这个链接

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

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

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.