仮定;
次の場所にmファイルがあります。
C:\M1\M2\M3\mfile.m
そして、MATLABのexeファイルはこの場所にあります:
C:\E1\E2\E3\matlab.exe
このmファイルをMatlabでコマンドラインから、たとえば.batファイル内から実行したい。どうすればこれを行うことができますか?それを行う方法はありますか?
仮定;
次の場所にmファイルがあります。
C:\M1\M2\M3\mfile.m
そして、MATLABのexeファイルはこの場所にあります:
C:\E1\E2\E3\matlab.exe
このmファイルをMatlabでコマンドラインから、たとえば.batファイル内から実行したい。どうすればこれを行うことができますか?それを行う方法はありますか?
回答:
次のようなコマンドは、mファイルを正常に実行します。
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"
これまでの回答で言及されていなかった重要な点の1つは、明示的に示されていない場合、MATLABインタープリターはオープンのままであるということです。したがって、@ hkBattousaiの回答に次のexit
コマンドを追加します。
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"
mfile.m
エラーが発生した場合、明示的なexit
関数が呼び出されず、プロセス全体が待機します...
スクリプトからのエラーを適切に処理するために代わりに使用するものは次のとおりです。
"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"
ここで元の参照を見つけました。元のリンクがなくなったので、今日もまだ有効な代替の新しいリーダーへのリンクを次に示します。
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
そうでない場合に出力します。
"try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
手順は次のとおりです。
cd C:\M1\M2\M3
C:\E1\E2\E3\matlab.exe -r mfile
Windowsシステムは、MATLABが.mファイルを検索する場所として現在のフォルダーを使用し、この-r
オプションは、起動が発生するとすぐに、指定された.mファイルを起動しようとします。
CreateProcessW()
。
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
R2019b以降、新しいコマンドラインオプションがあり-batch
ます。これは-r
、推奨されなくなったに代わるものです。また、プラットフォーム間で構文を統一します。たとえばWindowsのドキュメントを参照してください。他のプラットフォームについては、説明は同じです。
matlab -batch "statement to run"
これにより、デスクトップまたはスプラッシュスクリーンなしでMATLABが起動しstdout
、およびへのすべての出力をログに記録しstderr
、ステートメントが完了すると自動的に終了し、成功またはエラーを報告する終了コードを提供します。
したがって、コードを実行するためにtry
/ を使用するcatch
必要がなくなり、exit
ステートメントを追加する必要がなくなりました。
回答には入力引数のフィードに関する情報がないため、ここに追加することが重要です。いくつかの調査の後、私はこのリンクを見つけました
引数のフィードは、Matlab関数を実行する方法とよく似ています。
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
何らかの方法でbash /ターミナルから引数を取得している場合は、次のようにbashコマンドに挿入するだけです。
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(これは、いくつかの試行錯誤の後で)