我想从 MATLAB 在 dos 中执行批处理文件,并将控制权立即返回给 MATLAB。但是,我想在不打开 dos 窗口的情况下执行此操作(或者至少让 dos 窗口在最后消失)。
如果我像这样格式化我的命令......
s = dos('batchfilename.bat');
然后 MATLAB 运行批处理文件而不打开 dos 窗口,但 MATLAB 代码必须等待返回。
如果我像这样格式化我的命令......
s = dos('batchfilename.bat &');
控制权立即返回给 MATLAB,但它也显示 dos 窗口,这是我不想要的。 (当你这样做时,也很难检测批处理文件何时“完成”)
任何帮助,将不胜感激。
使用 Matlab 的外部接口支持来访问较低级别语言的过程控制功能。
.NET版本
使用.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
Java版本
.NET 版本需要足够新的 Matlab 才能支持 .NET。这是一个针对旧版 Matlab 的基于 Java 的版本,就像 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 版本中的 I/O 以避免挂起已启动的进程; demarcmj 指出,您需要读取并刷新进程的输入流以获取标准输出,以避免它被填满。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)