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?


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


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


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:


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.


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.


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


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


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.


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

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)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.