Matlab: เรียกใช้ m-file จาก command-line


108

สมมติว่า;

ฉันมี m-file ที่ตำแหน่ง:
C:\M1\M2\M3\mfile.m

และไฟล์ exe ของ matlab อยู่ที่ตำแหน่งนี้:
C:\E1\E2\E3\matlab.exe

ฉันต้องการเรียกใช้ไฟล์ m นี้ด้วย Matlab จากบรรทัดคำสั่งตัวอย่างเช่นภายในไฟล์. bat ฉันจะทำอย่างไรมีวิธีทำหรือไม่?


1
คุณอาจพบว่ามีประโยชน์เหล่านี้: stackoverflow.com/questions/14495/… , stackoverflow.com/questions/1857825/run-matlab-in-batch-mode
Amro

คำตอบ:


107

คำสั่งเช่นนี้เรียกใช้ m-file สำเร็จ:

"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

3
เครื่องหมายคำพูดเดี่ยวและคู่ในและรอบ ๆ คำสั่ง "run" มีความสำคัญ!
Kamran Bigdely

5
ถ้าคุณต้องการส่งผ่านข้อโต้แย้งล่ะ?

เวอร์ชัน Windows รองรับตัวเลือก -nodesktop หรือไม่ ฉันคิดว่าไม่ แต่อาจจะผิด
Terje Sandstrøm

70

ฉันคิดว่าประเด็นสำคัญประการหนึ่งที่ไม่ได้กล่าวถึงในคำตอบก่อนหน้านี้ก็คือหากไม่ได้ระบุไว้อย่างชัดเจนล่าม 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ฟังก์ชันExplicit จะไม่ถูกเรียกใช้ทำให้กระบวนการทั้งหมดรอ ...
malat

42

นี่คือสิ่งที่ฉันจะใช้แทนเพื่อจัดการข้อผิดพลาดจากสคริปต์อย่างสง่างาม:

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

ผมพบว่าการอ้างอิงเดิมที่นี่ เนื่องจากลิงก์เดิมหายไปแล้วนี่คือลิงก์ไปยังผู้อ่านใหม่ทางเลือกที่ยังมีชีวิตอยู่ในปัจจุบัน:


27

บน 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);"
danieleds

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 ผมยกให้เป็นตัวอย่าง CreateProcessW()อันที่จริงผมจะทำงานได้โดยฟังก์ชั่น Win32 API
hkBattousai


8

ขอบคุณ malat ความคิดเห็นของคุณช่วยฉัน แต่ฉันต้องการเพิ่มบล็อกลองจับของฉันเนื่องจากฉันพบMExeptionวิธีการgetReport()ที่ส่งคืนข้อความแสดงข้อผิดพลาดทั้งหมดและพิมพ์ไปยังคอนโซล matlab

นอกจากนี้ฉันยังพิมพ์ชื่อไฟล์เนื่องจากการคอมไพล์นี้เป็นส่วนหนึ่งของสคริปต์แบตช์ที่เรียก 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


5

ตั้งแต่ R2019b -batchมีตัวเลือกบรรทัดคำสั่งใหม่ แทนที่-rซึ่งไม่แนะนำอีกต่อไป นอกจากนี้ยังรวมไวยากรณ์ระหว่างแพลตฟอร์มต่างๆ ดูตัวอย่างเอกสารสำหรับ Windowsสำหรับแพลตฟอร์มอื่น ๆ คำอธิบายเหมือนกัน

matlab -batch "statement to run"

สิ่งนี้เริ่มต้น MATLAB โดยไม่มีเดสก์ท็อปหรือหน้าจอเริ่มต้นบันทึกเอาต์พุตทั้งหมดไปยังstdoutและstderrออกโดยอัตโนมัติเมื่อคำสั่งเสร็จสมบูรณ์และให้รหัสออกในการรายงานความสำเร็จหรือข้อผิดพลาด

ดังนั้นจึงไม่จำเป็นต้องใช้try/ catchรอบโค้ดเพื่อรันอีกต่อไปและไม่จำเป็นต้องเพิ่มexitคำสั่งอีกต่อไป


2

ฉันเรียกใช้คำสั่งนี้ภายในสคริปต์ทุบตีโดยเฉพาะอย่างยิ่งเพื่อส่งงาน SGE และกระบวนการแบทช์:

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

0

เนื่องจากไม่มีคำตอบใดที่มีข้อมูลเกี่ยวกับการป้อนอาร์กิวเมนต์การป้อนข้อมูลจึงเป็นสิ่งสำคัญที่จะต้องเพิ่มที่นี่ หลังจากการวิจัยฉันพบลิงค์นี้

การป้อนอาร์กิวเมนต์นั้นคล้ายกับการเรียกใช้ฟังก์ชัน Matlab

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

หากคุณได้รับอาร์กิวเมนต์จาก bash / terminal คุณก็ต้องแทรกสิ่งนั้นลงในคำสั่ง bash เป็น:

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

(นี่คือหลังจากการลองผิดลองถูกสองสามครั้ง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.