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

标签 matlab batch-file dos

我想从 MATLAB 在 dos 中执行一个批处理文件,并立即将控制权返回给 MATLAB。但是,我想在不打开 dos 窗口的情况下执行此操作(或者,至少,让 dos 窗口在最后消失)。

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

s = dos('batchfilename.bat');

然后MATLAB在不打开dos窗口的情况下运行批处理文件,但是MATLAB代码必须等待返回。

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

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

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

如有任何帮助,我们将不胜感激。

最佳答案

使用 Matlab 的外部接口(interface)支持来访问较低级别语言的过程控制功能。

.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 指出您需要读取并刷新进程的输入流以获取 stdout 以避免它填满。

关于matlab - 如何从 MATLAB 执行 dos 命令并立即将控制权返回给 MATLAB(不生成 dos 窗口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931000/

相关文章:

java - 如何在 vm 参数中提供 Windows 环境变量值?

path - 如何将新工具箱添加到我已安装的 Matlab 版本中?

windows - 如何使用批处理文件从系统配置中删除环境变量

batch-file - 我应该如何执行此文件/文件夹分发任务; SSIS 还是命令脚本?

c# - 使用 UseShellExecute 启动 java

batch-file - DOSBOX运行外部Windows程序

graphics - 无限循环似乎在 NASM 中不起作用?

matlab - HOG特征向量降维

matlab - CBIR系统如何计算 "Average Precision and Ranking"

r - 什么是 Matlab/Octave 等效项或 R 的 'merge'(或 'expand.grid')?