MATLABのプログラムを実行ファイルにしたとき,実行ファイルのパスを取得したい
古いコメントを表示
.mファイルで自分のいるパスを取得するとき,pwdを使って絶対パスを取得し,同じ階層に絶対パスでディレクトリを作成し,その中に処理したファイルを格納するようにプログラムを書いたのですが,MATLAB Compilerでファイルをコンパイルし,exeファイルにすると自分のいる(exeファイルのある場所)絶対パスを取得できないのですが,どうしたらいいでしょうか?
絶対パスの取得が無理なら相対パスでもいいのですが,exeと同じ階層にディレクトリを作り,その中に処理したファイルを格納する方法をご教示ください.
採用された回答
その他の回答 (4 件)
Yumi Iwakami
2018 年 2 月 27 日
0 投票
4 件のコメント
Kojiro Saito
2018 年 2 月 27 日
確認ありがとうございます。VBのShellコマンドからexeをキックした際に何かエラーは出ていませんでしょうか? VB側にエラーが出ていなければ、exe側にログが出ていると思います。MATLAB Compilerコンパイル時に「ログファイルの作成」にチェックを入れてコンパイルして、ログファイルを確認してみていただけますか。
Yumi Iwakami
2018 年 2 月 27 日
Kojiro Saito
2018 年 2 月 27 日
VBでGUIをボタンだけの作成して上記のgetPwd.exeを実行するプログラムを作ってみましたが、問題なくpwdの結果を取得でき、resultフォルダーを作成しA.csvも出力されました。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Run.Click
Dim RetVal
RetVal = Shell("getPwd")
End Sub

ですので、VBからMATLAB Compilerのexeを実行してもpwdは取得できているので、本件の原因はMATLABの処理の書き方にあるかもしれません、VB側のエラーにある、MATLABスクリプトの38行目では具体的にどのような処理を行っていますでしょうか?
Yumi Iwakami
2018 年 2 月 28 日
Yumi Iwakami
2018 年 2 月 28 日
1 件のコメント
Kojiro Saito
2018 年 2 月 28 日
MATLAB Runtimeのキャッシュが悪さしているのかもしれません。
C:\Users\ユーザー名\AppData\Local\Temp\ユーザー名 の中にmcrCache9.3(R2017bの場合)やmcrCache9.2(R2017aの場合)というフォルダーがあるので、該当のMATLABバージョンに対応するRuntimeのキャッシュフォルダーを削除してからexeをダブルクリックで実行してみてもらえますでしょうか。
Yumi Iwakami
2018 年 2 月 28 日
編集済み: Yumi Iwakami
2018 年 2 月 28 日
1 件のコメント
Kojiro Saito
2018 年 2 月 28 日
残るはVBからの呼び出しですね。VBのShellコマンドは非同期処理なので、MATLAB Compilerで作ったexeを起動した後、処理完了を待たずにVBの先の処理に進んでしまいます。
exeの処理が完了までVB側が待機するように、Shellコマンドではなく、WaitForExitを使ってみてはいかがでしょうか。
Imports System.Diagnostics
Sub Test()
Dim proc As New Process()
proc.StartInfo.FileName = "D:\testScript\ファイル名.exe"
proc.Start()
proc.WaitForExit()
End Sub
また、元のMATLAB関数でリターンを設定しても、exeにしてVBから実行するとリターンされるのはexeの成功か失敗かのフラグなので、もしMATLABからVB側に変数を返すようにしたいのでしたらMATLAB側で変数をファイルに書き込み、それをVB側で読み込むようにする必要があります。
Yumi Iwakami
2018 年 2 月 28 日
0 投票
3 件のコメント
Yumi Iwakami
2018 年 2 月 28 日
Kojiro Saito
2018 年 2 月 28 日
なるほどVBAでしたか。ExcelなどからVBAを実行していますか? その場合、カレントディレクトリがC:\Users\ユーザー名\Documents になっている可能性があります。 VBAのShellコマンド実行前にカレントディレクトリをexeと同じフォルダーに明示的に変更してみてはいかがでしょうか。
ChDrive "D:"
ChDir "D:\testScript"
また、VBAからexeを同期実行させる手段として、WshShellクラスを利用する方法もあります。
Yumi Iwakami
2018 年 2 月 28 日
カテゴリ
ヘルプ センター および File Exchange で 入力引数と出力引数 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!


