Matlab: Chạy một tệp m từ dòng lệnh


106

Giả sử rằng;

Tôi có một tệp m ở vị trí:
C:\M1\M2\M3\mfile.m

Và tệp exe của matlab nằm ở vị trí này:
C:\E1\E2\E3\matlab.exe

Tôi muốn chạy tệp m này bằng Matlab, từ dòng lệnh, chẳng hạn như bên trong tệp .bat. Làm thế nào tôi có thể làm điều này, có một cách để làm điều đó?


Câu trả lời:


106

Một lệnh như thế này chạy m-file thành công:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"


Một câu hỏi tương tự khác ở đây để trả lời: stackoverflow.com/questions/25102699/…
Eghbal

6
Sẽ rất tốt nếu bạn thêm lệnh "exit" vào cuối để làm cho câu trả lời của bạn thực tế và hữu ích hơn.
Kamran Bigdely

3
Dấu ngoặc kép đơn và dấu ngoặc kép trong và xung quanh lệnh "run" rất quan trọng!
Kamran Bigdely

5
Điều gì xảy ra nếu bạn muốn chuyển các đối số?

Phiên bản Windows có hỗ trợ tùy chọn -nodesktop không? Tôi nghĩ là không, nhưng có thể sai.
Terje Sandstrøm

70

Tôi nghĩ rằng một điểm quan trọng không được đề cập trong các câu trả lời trước đó là, nếu không được chỉ ra rõ ràng, trình thông dịch matlab sẽ vẫn mở. Do đó, đối với câu trả lời của @hkBattousai, tôi sẽ thêm exitlệnh:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"


7
Vì một số lý do nếu mfile.mkích hoạt lỗi, exithàm rõ ràng sẽ không bao giờ được gọi, khiến toàn bộ quá trình phải chờ đợi ...
malat 14/09/15

41

Đây là những gì tôi sẽ sử dụng thay thế, để xử lý các lỗi từ tập lệnh một cách duyên dáng:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

Nếu bạn muốn chi tiết hơn:

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

Tôi tìm thấy tài liệu tham khảo ban đầu ở đây . Vì liên kết gốc hiện đã biến mất, đây là liên kết đến trình đọc mới thay thế vẫn còn tồn tại cho đến ngày nay:


26

Trên Linux, bạn có thể làm tương tự và bạn thực sự có thể gửi lại cho shell một mã lỗi tùy chỉnh, như sau:

#!/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: $?"

nó sẽ in matlab exit code: 1nếu script ném một ngoại lệ, matlab exit code: 0ngược lại.


3
Để hiển thị lỗi như MATLAB sẽ làm khi không bắt được nó, chỉ cần thực hiện "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds

13

Đây là các bước:

  1. Bắt đầu dòng lệnh.
  2. Nhập thư mục chứa tệp .m với cd C:\M1\M2\M3
  3. Chạy như sau: C:\E1\E2\E3\matlab.exe -r mfile

Hệ thống Windows sẽ sử dụng thư mục hiện tại của bạn làm vị trí cho MATLAB để tìm kiếm tệp .m và -rtùy chọn cố gắng khởi động tệp .m đã cho ngay khi khởi động.


1
Nó sẽ không chạy bên trong tệp .bat. Tôi đã cho nó như một ví dụ. Trên thực tế, tôi sẽ chạy nó bằng hàm Win32 API CreateProcessW().
hkBattousai


8

Cảm ơn malat. Bình luận của bạn đã giúp tôi. Nhưng tôi muốn thêm khối try-catch của mình, vì tôi đã tìm thấy MExeptionphương thức getReport()trả về toàn bộ thông báo lỗi và in nó ra bảng điều khiển matlab.

Ngoài ra, tôi đã in tên tệp vì quá trình biên dịch này là một phần của tập lệnh lô gọi là matlab.

try
    some_code
    ...
catch message
    display(['ERROR in file: ' message.stack.file])
    display(['ERROR: ' getReport(message)])
end;

Đối với tên mô hình sai được chuyển cho phương pháp tạo mã kế thừa, đầu ra sẽ giống như sau:

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 ';']);

Cuối cùng, để hiển thị đầu ra tại cửa sổ nhắc lệnh windows, chỉ cần đăng nhập bảng điều khiển matlab vào một tệp có -logfile logfile.txt(sử dụng thêm -wait) và gọi lệnh batchtype logfile.txt


4

Kể từ R2019b, có một tùy chọn dòng lệnh mới -batch,. Nó thay thế -r, không còn được khuyến khích. Nó cũng thống nhất cú pháp giữa các nền tảng. Ví dụ: xem tài liệu dành cho Windows , đối với các nền tảng khác, mô tả giống hệt nhau.

matlab -batch "statement to run"

Thao tác này khởi động MATLAB mà không có màn hình nền hoặc màn hình hiển thị, ghi lại tất cả đầu ra vào stdoutstderr, tự động thoát khi câu lệnh hoàn thành và cung cấp mã thoát báo cáo thành công hoặc lỗi.

Do đó, không còn cần thiết phải sử dụng try/ catchxung quanh mã để chạy và không cần thêm một exitcâu lệnh nữa.


2

Tôi chạy lệnh này trong một tập lệnh bash, cụ thể là để gửi các công việc SGE và xử lý hàng loạt những thứ:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m

0

Vì không có câu trả lời nào có thông tin về đối số đầu vào cho ăn, điều quan trọng là phải thêm nó vào đây. Sau một số nghiên cứu, tôi tìm thấy liên kết này

Việc cung cấp các đối số rất giống với cách chúng ta chạy một hàm Matlab.

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

Nếu bạn đang nhận được một đối số nào đó từ bash / terminal, bạn chỉ cần chèn đối số đó vào lệnh bash như sau:

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

(Đây là sau một vài thử nghiệm và sai sót)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.