使用Matlab的外部接口支持来访问低级语言的进程控制功能。
.NET版本
使用.NET System.Diagnostics.Process类。它可以让您异步运行进程,检查其何时退出并收集退出代码。您还可以选择隐藏其窗口或保留其可见性以进行调试。
您可以直接从M代码调用.NET类。
function launch_a_bat_file()
batFile = 'c:\temp\example.bat';
startInfo = System.Diagnostics.ProcessStartInfo('cmd.exe', sprintf('/c "%s"', batFile));
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
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版本需要一个支持.NET的新版Matlab。这里提供一个基于Java的版本,适用于像OP这样的旧版Matlab。稍作修改后也可以在非Windows系统上使用。
function launch_a_bat_file_with_java
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();
if strfind(err.message, 'process has not exited')
fprintf('.');
pause(.1);
else
rethrow(err);
end
end
end
在Java版本中,您可能需要调整I/O以避免挂起启动的进程;demarcmj指出,您需要读取并刷新进程的输入流以避免stdout填满。