Предположим, что:
У меня есть m файл в местоположении: C:\M1\M2\M3\mfile.m
И файл exe из matlab находится в этом месте: 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');"
Я думаю, что один важный момент, который не упоминался в предыдущих ответах, заключается в том, что если явно не указано, интерпретатор 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
никогда не вызывается, что заставляет весь процесс ждать ...
Вот что я хотел бы использовать вместо этого, чтобы изящно обрабатывать ошибки из script:
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
, если script выдает исключение, 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()
.
cat 1.m | matlab -nodesktop -nosplash
И я использую Ubuntu
Благодаря малату. Ваш комментарий помог мне.
Но я хочу добавить блок try-catch, так как нашел метод MExeption
getReport()
, который возвращает все сообщение об ошибке и печатает его в консоли matlab.
Кроме того, я напечатал имя файла, поскольку эта компиляция является частью пакета script, который вызывает 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, просто запишите консоль matlab в файл с помощью -logfile logfile.txt
(используйте дополнительно -wait
) и вызовите командную команду type logfile.txt