dem*_*cmj 8 matlab dos batch-file
我想在MATLAB中用dos执行批处理文件,并立即将控制权返回给MATLAB.但是,我想在不打开dos窗口的情况下执行此操作(或者,至少在最后使dos窗口消失).
如果我像这样格式化我的命令......
s = dos('batchfilename.bat');
Run Code Online (Sandbox Code Playgroud)
然后MATLAB运行批处理文件而不打开dos窗口,但MATLAB代码必须等待返回.
如果我像这样格式化我的命令......
s = dos('batchfilename.bat &');
Run Code Online (Sandbox Code Playgroud)
控制立即返回到MATLAB,但它也显示了我不想要的dos窗口.(以这种方式执行时,检测批处理文件的时间也很困难)
任何帮助,将不胜感激.
使用Matlab的外部接口支持可以访问较低级语言的过程控制功能.
使用.NET System.Diagnostics.Process类.它可以让你异步运行一个进程,检查它何时退出,并收集退出代码.您可以选择隐藏其窗口或使其可见以进行调试.
您可以直接从M代码调用.NET类.
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
Run Code Online (Sandbox Code Playgroud)
.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
Run Code Online (Sandbox Code Playgroud)
您可能需要在Java版本中使用I/O以避免挂起已启动的进程; demarcmj指出,您需要读取并刷新进程的stdout输入流,以避免它填满.