Matlab: Komut satırından bir m dosyasını çalıştırma


107

Farz et ki;

Konumda bir m dosyam var:
C:\M1\M2\M3\mfile.m

Ve matlab'ın exe dosyası bu konumdadır:
C:\E1\E2\E3\matlab.exe

Bu m dosyasını Matlab ile komut satırından, örneğin bir .bat dosyası içinde çalıştırmak istiyorum. Bunu nasıl yapabilirim, yapmanın bir yolu var mı?


Yanıtlar:


107

Bunun gibi bir komut, m dosyasını başarıyla çalıştırır:

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


Bir başka benzer soru da yanıtlamak için burada: stackoverflow.com/questions/25102699/…
Eghbal

6
Cevabınızı daha pratik ve yararlı hale getirmek için sonuna "çıkış" komutu eklerseniz bu iyi olur.
Kamran Bigdely

3
"Çalıştır" komutunun içindeki ve etrafındaki tek ve çift tırnak işaretleri önemlidir!
Kamran Bigdely

5
Ya argümanlar iletmek istersen?

Windows sürümü -nodesktop seçeneğini destekliyor mu? Ben düşünmedim ama yanlış olabilir.
Terje Sandstrøm

70

Önceki cevaplarda belirtilmeyen önemli bir nokta, açıkça belirtilmediği takdirde matlab yorumlayıcısının açık kalacağıdır. Bu nedenle @hkBattousai cevabına şu exitkomutu ekleyeceğim :

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


7
Nedense eğer mfile.mtetikleyicileri açık bir hata exitfonksiyonu asla denir, bütün süreci beklemek yapma ...
malat

41

Komut dosyasındaki hataları incelikle işlemek için bunun yerine kullanacağım şey:

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

Daha fazla ayrıntı istiyorsanız:

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

Orijinal referansı burada buldum . Orijinal bağlantı artık kaybolduğundan, işte bugün hala hayatta olan alternatif bir yeni okuyucunun bağlantısı:


27

Linux'ta da aynısını yapabilirsiniz ve aslında kabuğa aşağıdaki gibi özel bir hata kodu gönderebilirsiniz:

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

aksi takdirde matlab exit code: 1komut dosyası bir istisna atarsa yazdırır matlab exit code: 0.


3
Hatayı, MATLAB'ın onu yakalayamadığında yapacağı gibi görüntülemek için, sadece yapın "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
danieleds

13

İşte adımlar:

  1. Komut satırını başlatın.
  2. .M dosyasını içeren klasörü girin cd C:\M1\M2\M3
  3. Aşağıdakileri çalıştırın: C:\E1\E2\E3\matlab.exe -r mfile

Windows sistemleri, MATLAB'ın .m dosyalarını aramak için konum olarak geçerli klasörünüzü kullanır ve bu -rseçenek, başlangıç ​​gerçekleşir gerçekleşmez verilen .m dosyasını başlatmaya çalışır.


1
Bir .bat dosyası içinde çalışmaz. Örnek olarak verdim. Aslında bunu Win32 API fonksiyonu ile çalıştıracağım CreateProcessW().
hkBattousai


8

Malat sayesinde. Sizin açıklama bana yardımcı oldu. Ama MExeptionyöntemi bulduğum için try-catch bloğumu eklemek istiyorumgetReport() tüm hata mesajını döndüren ve matlab konsoluna yazdıran .

Ayrıca bu derleme matlab'ı çağıran bir toplu iş betiğinin parçası olduğu için dosya adını da yazdırdım.

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

Eski kod oluşturma yöntemine geçirilen yanlış bir model adı için çıktı şöyle görünecektir:

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

Son olarak, çıktıyı Windows komut istemi penceresinde görüntülemek için, matlab konsolunu bir dosyaya kaydedin -logfile logfile.txt(ek olarak kullanın -wait) ve batch komutunu çağırıntype logfile.txt


5

R2019b'den beri yeni bir komut satırı seçeneği var -batch. -rArtık tavsiye edilmeyen yerini alıyor . Ayrıca söz dizimini platformlar arasında birleştirir. Örneğin Windows belgelerine bakın , diğer platformlar için açıklama aynıdır.

matlab -batch "statement to run"

Bu, masaüstü ya da giriş ekranı olmadan MATLAB başlar tüm çıkışları günlüğe kaydeder stdoutve stderr, çıkışlar otomatik olarak ifadesi tamamlar ve başarı veya hata raporlama bir çıkış kodu sağlar.

Bu nedenle , çalıştırılacak kodu kullanmak try/ catchetrafında kullanmak artık gerekli değildir ve artık bir exitifade eklemek gerekmez .


2

Bu komutu, özellikle SGE işlerini ve toplu işlem işlerini göndermek için bir bash betiği içinde çalıştırıyorum:

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

0

Yanıtların hiçbiri girdi argümanını besleme hakkında bilgi içermediğinden, onu buraya eklemek önemlidir. Biraz araştırdıktan sonra bu bağlantıyı buldum

Bağımsız değişkenleri beslemek, bir Matlab işlevini çalıştırma şeklimize çok benzer.

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

Bir şekilde bash / terminalden bir argüman alıyorsanız, bunu bash komutuna şu şekilde eklemeniz yeterlidir:

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

(Bu birkaç deneme yanılmadan sonra)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.