한다고 가정;
위치에 m 파일이 있습니다.
C:\M1\M2\M3\mfile.m
그리고 matlab의 exe 파일은 다음 위치에 있습니다.
C:\E1\E2\E3\matlab.exe
예를 들어 .bat 파일 내에서 명령 줄에서 Matlab으로이 m- 파일을 실행하고 싶습니다. 어떻게해야하나요? 방법이 있나요?
한다고 가정;
위치에 m 파일이 있습니다.
C:\M1\M2\M3\mfile.m
그리고 matlab의 exe 파일은 다음 위치에 있습니다.
C:\E1\E2\E3\matlab.exe
예를 들어 .bat 파일 내에서 명령 줄에서 Matlab으로이 m- 파일을 실행하고 싶습니다. 어떻게해야하나요? 방법이 있나요?
답변:
다음과 같은 명령은 m 파일을 성공적으로 실행합니다.
"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
함수가 호출되지 않아 전체 프로세스가 대기합니다 ...
스크립트의 오류를 정상적으로 처리하기 위해 대신 사용하는 방법은 다음과 같습니다.
"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()
.
말라 트 덕분입니다. 귀하의 의견이 도움이되었습니다. 그러나 전체 오류 메시지를 반환하고 MATLAB 콘솔에 인쇄 하는 MExeption
메서드 getReport()
를 찾았 으므로 try-catch 블록을 추가하고 싶습니다 .
또한이 컴파일은 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
문을.
답변에는 입력 인수 제공에 대한 정보가 없으므로 여기에 추가하는 것이 중요합니다. 조사 끝에이 링크를 찾았습니다
인수를 공급하는 것은 Matlab 함수를 실행하는 방법과 매우 유사합니다.
matlab -r 'try myfunction(argument1,argument2); catch; end; quit'
어떻게 든 bash / terminal에서 인수를 얻는 경우 다음과 같이 bash 명령에 삽입하면됩니다.
matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'
(이것은 몇 번의 시행 착오 후입니다)