Используйте поддержку внешних интерфейсов Matlab для получения доступа к функциям управления процессами языка более низкого уровня.
.NET версия
Используйте класс .NET System.Diagnostics.Process. Это позволит вам запустить процесс асинхронно, проверить, когда он завершился, и собрать код выхода. И вы можете при желании скрыть его окно или оставить его видимым для отладки.
Вы можете вызывать .NET классы напрямую из M-кода.
function launch_a_bat_file()
%//LAUNCH_A_BAT_FYLE Run a bat file with asynchronous process control
batFile = 'c:\temp\example.bat';
startInfo = System.Diagnostics.ProcessStartInfo('cmd.exe', sprintf('/c "%s"', batFile));
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; %// if you want it invisible
proc = System.Diagnostics.Process.Start(startInfo);
if isempty(proc)
error('Failed to launch process');
end
while true
if proc.HasExited
fprintf('\nProcess exited with status %d\n', proc.ExitCode);
break
end
fprintf('.');
pause(.1);
end
Java-версия
. Для версии .NET требуется Matlab, достаточно новый для поддержки .NET. Вот Java-версия для старых Matlabs, как, например, OP. Должно также работать в системах, отличных от Windows, с небольшими изменениями.
function launch_a_bat_file_with_java
%LAUNCH_A_BAT_FILE_WITH_JAVA Java-based version for old Matlab versions
batFile = 'c:\temp\example.bat';
cmd = sprintf('cmd.exe /c "%s"', batFile);
runtime = java.lang.Runtime.getRuntime();
proc = runtime.exec(cmd);
while true
try
exitCode = proc.exitValue();
fprintf('\nProcess exited with status %d\n', exitCode);
break;
catch
err = lasterror(); % old syntax for compatibility
if strfind(err.message, 'process has not exited')
fprintf('.');
pause(.1);
else
rethrow(err);
end
end
end
Возможно, вам придется поиграться с вводом / выводом в версии Java, чтобы избежать зависания запущенного процесса; demarcmj отмечает, что вам нужно прочитать и очистить поток ввода процесса для stdout, чтобы избежать его заполнения.