Matlab: Running an m-file from command-line - matlab

Suppose that;
I have an m-file at location:
C:\M1\M2\M3\mfile.m
And exe file of the matlab is at this location:
C:\E1\E2\E3\matlab.exe
I want to run this m-file with Matlab, from command-line, for example inside a .bat file. How can I do this, is there a way to do it?

A command like this runs the m-file successfully:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"

I think that one important point that was not mentioned in the previous answers is that, if not explicitly indicated, the matlab interpreter will remain open.
Therefore, to the answer of #hkBattousai I will add the exit command:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"

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. Since original link is now gone, here is the link to an alternate newreader still alive today:
exit matlab when running batch m file

On Linux you can do the same and you can actually send back to the shell a custom error code, like the following:
#!/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: $?"
it prints matlab exit code: 1 if the script throws an exception, matlab exit code: 0 otherwise.

Here are the steps:
Start the command line.
Enter the folder containing the .m file with cd C:\M1\M2\M3
Run the following: C:\E1\E2\E3\matlab.exe -r mfile
Windows systems will use your current folder as the location for MATLAB to search for .m files, and the -r option tries to start the given .m file as soon as startup occurs.

Since R2019b, there is a new command line option, -batch. It replaces -r, which is no longer recommended. It also unifies the syntax across platforms. See for example the documentation for Windows, for the other platforms the description is identical.
matlab -batch "statement to run"
This starts MATLAB without the desktop or splash screen, logs all output to stdout and stderr, exits automatically when the statement completes, and provides an exit code reporting success or error.
It is thus no longer necessary to use try/catch around the code to run, and it is no longer necessary to add an exit statement.

cat 1.m | matlab -nodesktop -nosplash
And I use Ubuntu

Thanks to malat. Your comment helped me.
But I want to add my try-catch block, as I found the MExeption method getReport() that returns the whole error message and prints it to the matlab console.
Additionally I printed the filename as this compilation is part of a batch script that calls matlab.
try
some_code
...
catch message
display(['ERROR in file: ' message.stack.file])
display(['ERROR: ' getReport(message)])
end;
For a false model name passed to legacy code generation method, the output would look like:
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 ';']);
Finally, to display the output at the windows command prompt window, just log the matlab console to a file with -logfile logfile.txt (use additionally -wait) and call the batch command type logfile.txt

I run this command within a bash script, in particular to submit SGE jobs and batch process things:
/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m

Since none of the answers has information about feeding input argument, it is important to
add it here. After some research, I found this link
Feeding the arguments is very similar to how we run a Matlab function.
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
If you are somehow getting an argument from bash/terminal, you simply need to insert that into the bash command as:
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(This is after a couple of trial and error)

Related

How to run matlab from the command line and print to the command line?

I want to run a script on windows dos terminal where the script will display "Hello world" to the terminal I executed this from e.g.
matlab.exe -nosplash -nodesktop -nojvm -wait -r printToCommandLine.m
Where printToCommandLine.m contains:
system(sprintf('echo Hello world'));
but it only prints to the matlab command window that gets generated when executing the script
First, I am not shure, if the syntax has changed, but I have to call the script without the file extension '.m':
matlab.exe -nosplash -nodesktop -nojvm -wait -r printToCommandLine
Otherwise I will get an error within MATLAB.
Second, this is just a work around, but you can print your current command line output to a log file e.g. 'log.txt' using
matlab.exe -nosplash -nodesktop -nojvm -wait -logfile "log.txt" -r printToCommandLine
The log file will be updated at runtime. To test this, I created a small example script and had a look how 'log.txt' changes during execution:
disp('Script execution started. Waiting 10 seconds...')
pause(10)
disp('...waited 10 seconds.');
This is not exactly what you wanted but it gives you the chance to get actual information about the current command line output during your execution (in a text file).
We use this for automated (remote) testing to print our MATLAB command line output to the console after the tests pass with
type log.txt

How to open a matlab program using windows command prompt? (in a single window) [duplicate]

Suppose that;
I have an m-file at location:
C:\M1\M2\M3\mfile.m
And exe file of the matlab is at this location:
C:\E1\E2\E3\matlab.exe
I want to run this m-file with Matlab, from command-line, for example inside a .bat file. How can I do this, is there a way to do it?
A command like this runs the m-file successfully:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"
I think that one important point that was not mentioned in the previous answers is that, if not explicitly indicated, the matlab interpreter will remain open.
Therefore, to the answer of #hkBattousai I will add the exit command:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"
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. Since original link is now gone, here is the link to an alternate newreader still alive today:
exit matlab when running batch m file
On Linux you can do the same and you can actually send back to the shell a custom error code, like the following:
#!/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: $?"
it prints matlab exit code: 1 if the script throws an exception, matlab exit code: 0 otherwise.
Here are the steps:
Start the command line.
Enter the folder containing the .m file with cd C:\M1\M2\M3
Run the following: C:\E1\E2\E3\matlab.exe -r mfile
Windows systems will use your current folder as the location for MATLAB to search for .m files, and the -r option tries to start the given .m file as soon as startup occurs.
Since R2019b, there is a new command line option, -batch. It replaces -r, which is no longer recommended. It also unifies the syntax across platforms. See for example the documentation for Windows, for the other platforms the description is identical.
matlab -batch "statement to run"
This starts MATLAB without the desktop or splash screen, logs all output to stdout and stderr, exits automatically when the statement completes, and provides an exit code reporting success or error.
It is thus no longer necessary to use try/catch around the code to run, and it is no longer necessary to add an exit statement.
cat 1.m | matlab -nodesktop -nosplash
And I use Ubuntu
Thanks to malat. Your comment helped me.
But I want to add my try-catch block, as I found the MExeption method getReport() that returns the whole error message and prints it to the matlab console.
Additionally I printed the filename as this compilation is part of a batch script that calls matlab.
try
some_code
...
catch message
display(['ERROR in file: ' message.stack.file])
display(['ERROR: ' getReport(message)])
end;
For a false model name passed to legacy code generation method, the output would look like:
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 ';']);
Finally, to display the output at the windows command prompt window, just log the matlab console to a file with -logfile logfile.txt (use additionally -wait) and call the batch command type logfile.txt
I run this command within a bash script, in particular to submit SGE jobs and batch process things:
/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
Since none of the answers has information about feeding input argument, it is important to
add it here. After some research, I found this link
Feeding the arguments is very similar to how we run a Matlab function.
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
If you are somehow getting an argument from bash/terminal, you simply need to insert that into the bash command as:
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(This is after a couple of trial and error)

nohup won't finish my MATLAB script

I have a Matlab script that I run with nohup when I ssh to a server. For some reason, it looks like the programs runs "flawlessly" but when I check the output file it's blank, and none of the files it was supposed to generate are created. So it seems as if MATLAB goes inside the function that I want to run, and then quits sporadically. Yet it quits with a [+DONE] flag which is very strange, since it really isn't done, if anything, I don't think it actually started...
I don't get the same problem if I open up MATLAB and run the same function on the GUI while I'm ssh'ed.
This is what I put in the terminal:
nohup matlab -nojvm -nodisplay -nosplash <function_CV.m >CV_file.txt </dev/null &
I added the "< /dev/null"
because my nohup was getting weird with a looped 'Bad file descriptor error' for a pointless instruction such as magic(3);exit;. So I'm not sure if maybe my nohup version is buggy?
Update: I've decided to use screen instead. I'd still appreciate any workarounds to this problem.
Indeed it is very strange. The only solution I could came up with would be to replace:
nohup matlab -nojvm -nodisplay -nosplash <function_CV.m >CV_file.txt </dev/null &
with:
nohup matlab -nojvm -nodisplay -nosplash function_CV.M > /dev/null 2>&1 & echo $! > CV_file.txt
I tried it with some own .m file and it worked, so either it should work for you, either the problem is in your function_CV.m.
Hope this helps!

Matlab exit force with return code greater than zero

I've a Matlab R2007b script which I call from a batch script like this:
matlab.exe -nosplash -nodesktop -r my_script
I've a try/catch block in the Matlab script and on error it runs exit(1), to indicate to the calling process (indirectly, Jenkins!) that the process has failed.
This works great except occasionally on exit via error Matlab wants to save any modified files and pops up a save dialogue (not great when you're running headless with Jenkins!). I can avoided this with a 'exit force' but then my return code is always 0 (indicating success to Jenkins).
Is it possible in Matlab to force exit AND set a return code greater than zero?
exit(1) force
I have also tried to figure out a solution to this issue. Since working with environment variables did not work out the way we wanted, I created a workaround with a dummy file that is created whenever the Matlab call fails and then checked in Jenkins (currently no Matlab access, maybe some quotes are wrong):
matlab -r "try, [returnVal]=ScriptName;catch, disp('exception occurred']); returnVal= -1; end, if (returnVal~= 0), fid = fopen('errorFile.txt','wt'); fclose(fid); end, exit force"
IF EXIST errorFile.txt (exit /b 1)
Generally, of course, it also makes sense to include additional arguments in the matlab call, for Windows, e.g.:
matlab -log -nosplash -nodesktop -noFigureWindows -minimize -wait

How can I stop MATLAB from returning until after a command-line script completes?

I see in the MATLAB help (matlab -h) that I can use the -r flag to specify an m-file to run. I notice when I do this, MATLAB seems to start the script, but immediately return. The script processes fine, but the main app has already returned.
Is there any way to get MATLAB to only return once the command is finished? If you're calling it from a separate program it seems like it's easier to wait on the process than to use a file or sockets to confirm completion.
To illustrate, here's a sample function waitHello.m:
function waitHello
disp('Waiting...');
pause(3); %pauses 3 seconds
disp('Hello World');
quit;
And I try to run this using:
matlab -nosplash -nodesktop -r waitHello
Quick answer:
matlab -wait -nosplash -nodesktop -r waitHello
In Matlab 7.1 (the version I have) there is an undocumented command line option -wait in matlab.bat. If it doesn't work for your version, you could probably add it in. Here's what I found. The command at the bottom that finally launches matlab is (line 153):
start "MATLAB" %START_WAIT% "%MATLAB_BIN_DIR%\%MATLAB_ARCH%\matlab" %MATLAB_ARGS%
The relevant syntax of the start command (see "help start" in cmd.exe) in this case is:
start ["window title"] [/wait] myprogram.exe args ...
A bit higher, among all of the documented command line options, I found (line 60):
) else if (%opt%) == (-wait) (
set START_WAIT=/wait
) else (
So specifying -wait should do what you want, as long as you're also exiting matlab from your script (otherwise it will wait for you to terminate it interactively).