【问题标题】:Calling a software from Matlab从 Matlab 调用软件
【发布时间】:2011-03-12 11:28:27
【问题描述】:

命令提示符在运行软件以及生成报告和输出文件的所有方面都运行良好。要生成包含所需结果的输出文件,我们必须运行使用参数文件的报告程序的可执行文件。例如,如果我要在命令提示符下实现这些步骤,它会是这样的:

“path\report.exe” –f Report.rwd –o Report.rwo

输出文件为 Report.rwo,该文件将包含导出的变量。

现在要在 Matlab 中实现这一点,下面是一个小脚本,给出了我想要实现的要点。它为每次运行调用软件并提取数据。

for nr=1:NREAL

      dlmwrite(‘file.INC’,file(:,nr),’delimiter’,’\n’); % Writes the data file for each run

       system('"path\file.dat"');    % calls software
       system('"path\Report.rwd" –o "path\Report.rwo"'); % calls report

      [a,b]=textread(‘"path\Report.rwo".rwo’,’%f\t%f’); % Reads the data and store it in the variable b

end

所以我有两个问题:

1) 当我在 Matlab 中运行此脚本时,它不会生成输出文件 Report.rwo。因此,当它到达包含 'textread' 函数的行时,由于文件不存在,它会出错。

2) 每次 Matlab 调用报告(.rwd 文件)时,它都会提示我按 Enter 键或键入 'q' 退出。如果假设有数百个文件要运行,那么对于每个文件,我都会被提示按 Enter 继续。以下行导致提示:

system('"path\Report.rwd" –o "path\Report.rwo"'); % Calls report

旧编辑:我的问题有 2 个更新如下:

更新 1: 我上面的问题的第 2 部分似乎已由 Jacob 解决。它运行良好。但是,只有当我能够运行涉及运行数百个文件的整个程序时,才能确认最终结果。

更新 2: 我可以运行软件并使用命令提示符生成输出文件,如下所示:

**“path\mx200810.exe” –f file.dat**
  • 此命令读取报告参数文件并生成输出文件:

    “路径\report.exe” -f Report.rwd -o Report.rwo

最新编辑:

1) 我可以运行软件,避免提示按回车键,并通过以下命令使用 Matlab 生成输出文件:

system('report.exe /f Report.rwd /o Report.rwo')
system('mx200810.exe -f file.dat')

但是,只有在将所需的 .exe 和 .dll 文件复制到拥有 .dat 文件的同一文件夹中后,我才能做到这一点。所以我通过我拥有所有这些文件的同一个文件夹运行 .m 文件。

2) 但是,Matlab 的命令窗口中仍然存在一个错误:

"...STOP: Unable to open the following file as data file:
              'file.dat'
              Check path name for spaces, special character or a total length greater than 256 characters

              Cannot find data file named 'file.dat'

Date and Time of End of Run: .....

ans = 0"

【问题讨论】:

    标签: matlab system command-prompt


    【解决方案1】:

    " .. " 中包含的字符串在 MATLAB 中无效,所以我不知道您的 system 函数如何运行。

    将所有" 替换为',然后更新您的问题并将命令行参数(例如-f file.dat)包含在引号内,如下所示:

      %# Calls software
      system('"path\mx200810.exe" –f file.dat'); 
    
      %# Calls report
      system('"path\report.exe" –f Report.rwd –o Report.rwo'); 
    

    更新:

    这是解决第二个问题的一个廉价技巧(输入q 以终止程序):

      %# Calls software
      system('"path\mx200810.exe" –f "path\file.dat" < "C:\inp.txt"'); 
    
      %# Calls report   
      system('"path\report.exe" –f "path\Report.rwd" –o "path\Report.rwo" < "C:\inp.txt"');
    
    1. 创建一个文件(例如C:\inp.txt),其中包含字母q,后跟返回字符。您可以通过打开记事本,输入q,按回车键并将其保存为C:\inp.txt 来创建它。这将作为report.exe 似乎需要的“输入”。
    2. 更改代码中的所有system 调用,以便将我们刚刚创建的文本文件的输入通过管道传输到其中。我已经包含了上面修改后的调用(滚动到最后查看差异)。

    【讨论】:

    • 我已经包含了一个“技巧”,它可能会解决您的第二个问题
    • 你确定"C:\Program Files\CMG\IMEX\2008.10\Win32\EXE\mx200810.exe""C:\Program Files\CMG\BR\2008.10\Win32\EXE\report.exe"的位置正确吗?
    • 您是否也将inp.txt 的新路径包含在" 中?
    • 但是由于您已将路径更改为带有空格的内容,请将其括起来。例如。 "C:\Users\Harpreet Harpreet\Desktop\inp.txt"
    • "C:\Users\Harpreet Harpreet\Desktop\inp.txt" 就是一个例子。您应该在桌面上将其替换为 inp.txt 的完整路径。这可以通过右键单击文件并查看其属性来获得。完整路径将在 Location 旁边。
    【解决方案2】:

    使用这两个输出来获取系统运行状态和文本结果(如果有的话)。

    cmd_line = '“path\report.exe” –f Report.rwd –o Report.rwo';
    [status, result] = system(cmd_line);
    

    根据status 变量继续您的脚本。如果超过零则停止。

    if (status)
        error('Error running report.exe')
    end
    [a,b]=textread(...
    

    如果您的参数是可变的,您可以在 MATLAB 中使用字符串连接或SPRINTF 函数生成命令行字符串。

    【讨论】:

    • cmd_line 是 MATLAB 变量。不要把它放在引号中。使用[status, result] = system(cmd_line)
    • 你在调用system之前是否给cmd_line分配了一个命令字符串?
    • 这很奇怪。尝试运行class(cmd_line),它会返回char吗?尝试将您的命令字符串作为参数直接放入系统调用中。
    • 您确定可以在 MATLAB 之外运行该命令吗?从命令提示符?
    • 如果您从 MATLAB 中最新的文件夹中的命令提示符运行程序,您的程序能否正常工作?您可以在 MATLAB 中找到运行 pwd 的文件夹。可能您应该首先将工作目录更改为您的输入文件所在的位置cd dirname。或者在命令行中包含输入文件的完整路径。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 2011-10-22
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多