如何从MATLAB执行dos命令并立即将控制返回给MATLAB(不产生dos窗口)

时间:2012-01-19 18:01:32

标签: matlab batch-file dos

我想在MATLAB中用dos执行批处理文件,并立即将控制权返回给MATLAB。但是,我想在不打开dos窗口的情况下这样做(或者,最后,让dos窗口在最后消失)。

如果我像这样格式化我的命令......

s = dos('batchfilename.bat');

然后MATLAB运行批处理文件而不打开dos窗口,但MATLAB代码必须等待返回。

如果我像这样格式化我的命令......

s = dos('batchfilename.bat &');

控制立即返回到MATLAB,但它也显示了我不想要的dos窗口。 (当你这样做时,批处理文件何时“完成”也很困难)

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:7)

使用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。这是一个基于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版本中使用I / O以避免挂起已启动的进程; demarcmj指出你需要读取并刷新进程的stdout输入流,以避免它填满。

答案 1 :(得分:3)

尝试使用与Windows命令解释程序捆绑在一起的start cmdlet。

你可以只做system('start /MIN batchfilename.bat');

在批处理文件的末尾放置一个exit命令,以确保没有留下(最小化)命令提示符。