Matlab:コマンドラインからのmファイルの実行


106

仮定;

次の場所にmファイルがあります。
C:\M1\M2\M3\mfile.m

そして、MATLABのexeファイルはこの場所にあります:
C:\E1\E2\E3\matlab.exe

このmファイルをMatlabでコマンドラインから、たとえば.batファイル内から実行したい。どうすればこれを行うことができますか?それを行う方法はありますか?


1
これらは便利かもしれません:stackoverflow.com/questions/14495/…、stackoverflow.com / questions
matlab

回答:


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」コマンドを追加して、回答をより実用的で役立つものにするとよいでしょう。
Kamran Bigdely 2015

3
「run」コマンド内および前後の単一引用符と二重引用符は重要です。
Kamran Bigdely 2015

5
引数を渡したい場合はどうしますか?

Windowsバージョンは-nodesktopオプションをサポートしていますか?私はそうは思わなかったが、間違っているかもしれない。
TerjeSandstrøm18年

70

これまでの回答で言及されていなかった重要な点の1つは、明示的に示されていない場合、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

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でも同じことができ、実際には次のようなカスタムエラーコードをシェルに送り返すことができます。

#!/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
エラーをキャッチしないときにMATLABが行うようにエラーを表示するには、次のようにします "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
18年

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


8

malatに感謝します。あなたのコメントは私を助けました。しかし、エラーメッセージ全体を返し、それをmatlabコンソールに出力するMExeptionメソッドを見つけたので、try-catchブロックを追加したいと思いgetReport()ます。

さらに、このコンパイルは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コマンドプロンプトウィンドウに出力を表示するには、-logfile logfile.txt(追加で使用して-wait)Matlabコンソールにファイルを記録し、バッチコマンドを呼び出します。type logfile.txt


4

R2019b以降、新しいコマンドラインオプションがあり-batchます。これは-r、推奨されなくなったに代わるものです。また、プラットフォーム間で構文を統一します。たとえばWindowsのドキュメントを参照してください。他のプラットフォームについては、説明は同じです。

matlab -batch "statement to run"

これにより、デスクトップまたはスプラッシュスクリーンなしでMATLABが起動しstdout、およびへのすべての出力をログに記録しstderr、ステートメントが完了すると自動的に終了し、成功またはエラーを報告する終了コードを提供します。

したがって、コードを実行するために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 /ターミナルから引数を取得している場合は、次のようにbashコマンドに挿入するだけです。

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

(これは、いくつかの試行錯誤の後で)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.