Matlab: Ausführen einer M-Datei über die Befehlszeile

106

Nehme an, dass;

Ich habe eine M-Datei vor Ort:
C:\M1\M2\M3\mfile.m

Und die exe-Datei des Matlab befindet sich an dieser Stelle:
C:\E1\E2\E3\matlab.exe

Ich möchte diese M-Datei mit Matlab über die Befehlszeile ausführen, beispielsweise in einer .bat-Datei. Wie kann ich das machen, gibt es eine Möglichkeit das zu tun?

hkBattousai
quelle

Antworten:

106

Ein Befehl wie dieser führt die m-Datei erfolgreich aus:

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

hkBattousai
quelle
Eine andere ähnliche Frage ist hier zu beantworten
Eghbal
6
Das wäre gut, wenn Sie am Ende den Befehl "exit" hinzufügen, um Ihre Antwort praktischer und hilfreicher zu gestalten.
Kamran Bigdely
3
Die einfachen und doppelten Anführungszeichen in und um den Befehl "Ausführen" sind wichtig!
Kamran Bigdely
5
Was ist, wenn Sie Argumente übergeben möchten?
Unterstützt die Windows-Version die Option -nodesktop? Ich dachte nicht, kann aber falsch sein.
Terje Sandstrøm
70

Ich denke, dass ein wichtiger Punkt, der in den vorherigen Antworten nicht erwähnt wurde, ist, dass der Matlab-Interpreter offen bleibt, wenn er nicht ausdrücklich angegeben wird. Daher werde ich zur Antwort von @hkBattousai den exitBefehl hinzufügen :

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

Elachell
quelle
7
Aus irgendeinem Grund, wenn mfile.mein Fehler exit
ausgelöst wird,
41

Folgendes würde ich stattdessen verwenden, um Fehler aus dem Skript ordnungsgemäß zu behandeln:

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

Wenn Sie mehr Ausführlichkeit wünschen:

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

Ich habe die Originalreferenz hier gefunden . Da der ursprüngliche Link jetzt weg ist, ist hier der Link zu einem alternativen Newreader, der heute noch lebt:

malat
quelle
26

Unter Linux können Sie dasselbe tun und einen benutzerdefinierten Fehlercode wie den folgenden an die Shell zurücksenden:

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

Andernfalls wird es gedruckt, matlab exit code: 1wenn das Skript eine Ausnahme matlab exit code: 0auslöst.

slux83
quelle
3
Um den Fehler so anzuzeigen, wie es MATLAB tun würde, wenn er nicht "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
abgefangen
13

Hier sind die Schritte:

  1. Starten Sie die Befehlszeile.
  2. Geben Sie den Ordner mit der .m-Datei mit ein cd C:\M1\M2\M3
  3. Führen Sie Folgendes aus: C:\E1\E2\E3\matlab.exe -r mfile

Windows-Systeme verwenden Ihren aktuellen Ordner als Speicherort für MATLAB, um nach .m-Dateien zu suchen, und die -rOption versucht, die angegebene .m-Datei zu starten, sobald der Start erfolgt.

Erdferkel
quelle
1
Es wird nicht in einer .bat-Datei ausgeführt. Ich habe es als Beispiel gegeben. Eigentlich werde ich es mit der Win32-API-Funktion ausführen CreateProcessW().
hkBattousai
12
cat 1.m | matlab -nodesktop -nosplash

Und ich benutze Ubuntu

Jia Ruipeng
quelle
8

Danke an malat. Ihr Kommentar hat mir geholfen. Ich möchte jedoch meinen Try-Catch-Block hinzufügen, da ich die MExeptionMethode gefunden habe getReport(), die die gesamte Fehlermeldung zurückgibt und auf der Matlab-Konsole druckt.

Zusätzlich habe ich den Dateinamen gedruckt, da diese Zusammenstellung Teil eines Batch-Skripts ist, das matlab aufruft.

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

Für einen falschen Modellnamen, der an die Legacy-Codegenerierungsmethode übergeben wird, sieht die Ausgabe folgendermaßen aus:

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 ';']);

Um die Ausgabe am Windows-Eingabeaufforderungsfenster anzuzeigen, protokollieren Sie einfach die Matlab-Konsole in einer Datei mit -logfile logfile.txt(zusätzlich verwenden -wait) und rufen Sie den Batch-Befehl auftype logfile.txt

CanO
quelle
4

Seit R2019b gibt es eine neue Befehlszeilenoption -batch. Es ersetzt -r, was nicht mehr empfohlen wird. Außerdem wird die Syntax plattformübergreifend vereinheitlicht. Siehe zum Beispiel die Dokumentation für Windows , für die anderen Plattformen ist die Beschreibung identisch.

matlab -batch "statement to run"

Dadurch wird MATLAB ohne Desktop- oder Begrüßungsbildschirm gestartet, alle Ausgaben werden in stdoutund protokolliert stderr, automatisch beendet, wenn die Anweisung abgeschlossen ist, und es wird ein Beendigungscode bereitgestellt, der über Erfolg oder Fehler berichtet.

Es ist somit nicht mehr notwendig zu verwenden try/ catchum den Code auszuführen, und es ist nicht mehr notwendig , eine hinzuzufügen exitAussage.

Cris Luengo
quelle
2

Ich führe diesen Befehl in einem Bash-Skript aus, insbesondere um SGE-Jobs zu senden und Dinge im Batch-Prozess zu verarbeiten:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
LMLacerda
quelle
0

Da keine der Antworten Informationen zum Füttern von Eingabeargumenten enthält, ist es wichtig, diese hier hinzuzufügen. Nach einigen Recherchen habe ich diesen Link gefunden

Das Einspeisen der Argumente ist dem Ausführen einer Matlab-Funktion sehr ähnlich.

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

Wenn Sie ein Argument von bash / terminal erhalten, müssen Sie es einfach wie folgt in den Befehl bash einfügen:

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

(Dies ist nach ein paar Versuchen und Irrtümern)

smttsp
quelle