สมมติว่า;
ฉันมี m-file ที่ตำแหน่ง:
C:\M1\M2\M3\mfile.m
และไฟล์ exe ของ matlab อยู่ที่ตำแหน่งนี้:
C:\E1\E2\E3\matlab.exe
ฉันต้องการเรียกใช้ไฟล์ m นี้ด้วย Matlab จากบรรทัดคำสั่งตัวอย่างเช่นภายในไฟล์. bat ฉันจะทำอย่างไรมีวิธีทำหรือไม่?
สมมติว่า;
ฉันมี m-file ที่ตำแหน่ง:
C:\M1\M2\M3\mfile.m
และไฟล์ exe ของ matlab อยู่ที่ตำแหน่งนี้:
C:\E1\E2\E3\matlab.exe
ฉันต้องการเรียกใช้ไฟล์ m นี้ด้วย Matlab จากบรรทัดคำสั่งตัวอย่างเช่นภายในไฟล์. bat ฉันจะทำอย่างไรมีวิธีทำหรือไม่?
คำตอบ:
คำสั่งเช่นนี้เรียกใช้ m-file สำเร็จ:
"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"
ฉันคิดว่าประเด็นสำคัญประการหนึ่งที่ไม่ได้กล่าวถึงในคำตอบก่อนหน้านี้ก็คือหากไม่ได้ระบุไว้อย่างชัดเจนล่าม 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
ฟังก์ชันExplicit จะไม่ถูกเรียกใช้ทำให้กระบวนการทั้งหมดรอ ...
นี่คือสิ่งที่ฉันจะใช้แทนเพื่อจัดการข้อผิดพลาดจากสคริปต์อย่างสง่างาม:
"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()
อันที่จริงผมจะทำงานได้โดยฟังก์ชั่น Win32 API
cat 1.m | matlab -nodesktop -nosplash
และฉันใช้ Ubuntu
ขอบคุณ 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
ตั้งแต่ R2019b -batch
มีตัวเลือกบรรทัดคำสั่งใหม่ แทนที่-r
ซึ่งไม่แนะนำอีกต่อไป นอกจากนี้ยังรวมไวยากรณ์ระหว่างแพลตฟอร์มต่างๆ ดูตัวอย่างเอกสารสำหรับ Windowsสำหรับแพลตฟอร์มอื่น ๆ คำอธิบายเหมือนกัน
matlab -batch "statement to run"
สิ่งนี้เริ่มต้น MATLAB โดยไม่มีเดสก์ท็อปหรือหน้าจอเริ่มต้นบันทึกเอาต์พุตทั้งหมดไปยังstdout
และstderr
ออกโดยอัตโนมัติเมื่อคำสั่งเสร็จสมบูรณ์และให้รหัสออกในการรายงานความสำเร็จหรือข้อผิดพลาด
ดังนั้นจึงไม่จำเป็นต้องใช้try
/ catch
รอบโค้ดเพื่อรันอีกต่อไปและไม่จำเป็นต้องเพิ่มexit
คำสั่งอีกต่อไป
ฉันเรียกใช้คำสั่งนี้ภายในสคริปต์ทุบตีโดยเฉพาะอย่างยิ่งเพื่อส่งงาน SGE และกระบวนการแบทช์:
/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m
เนื่องจากไม่มีคำตอบใดที่มีข้อมูลเกี่ยวกับการป้อนอาร์กิวเมนต์การป้อนข้อมูลจึงเป็นสิ่งสำคัญที่จะต้องเพิ่มที่นี่ หลังจากการวิจัยฉันพบลิงค์นี้
การป้อนอาร์กิวเมนต์นั้นคล้ายกับการเรียกใช้ฟังก์ชัน Matlab
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
หากคุณได้รับอาร์กิวเมนต์จาก bash / terminal คุณก็ต้องแทรกสิ่งนั้นลงในคำสั่ง bash เป็น:
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(นี่คือหลังจากการลองผิดลองถูกสองสามครั้ง)