所以这是我的故事。
我正在使用Windows操作系统。我正在运行一个Matlab GUI,在启动时启动另一个可执行文件。另一个可执行文件以批处理模式运行(在后台运行cmd。)
我想这样做,当用户点击Matlab GUI上的按钮时,另一个可执行文件将运行命令并保持打开状态。这可能吗?
注意:我不想打开新的cmd窗口,我希望现有的窗口执行命令。
答案 0 :(得分:4)
不幸的是,Matlab似乎没有你想要的能力,至少不是直接的。我发现了一篇文章,它解释了如何在.NET的帮助下解决这个问题,这很幸运,因为你在Windows平台上:http://www.mathworks.com/matlabcentral/answers/72356-using-matlab-to-send-strings-to-the-stdin-of-another-console-application
我从那篇帖子中复制了很多这个
function lh = task()
% Initialize the process and its StartInfo properties.
% The sort command is a console application that
% reads and sorts text input.
process = System.Diagnostics.Process;
process.StartInfo.FileName = 'sort.exe';
process.EnableRaisingEvents = true;
process.StartInfo.CreateNoWindow = true;
% Set UseShellExecute to false for redirection.
process.StartInfo.UseShellExecute = false;
%Redirect the standard output of the sort command.
process.StartInfo.RedirectStandardOutput = true;
% Set our event handler to asynchronously read the sort output.
lh = process.addlistener('OutputDataReceived',@sortOutputHandler);
% Redirect standard input as well. This stream
% is used synchronously.
process.StartInfo.RedirectStandardInput =true;
% Start the process.
process.Start();
%Use a stream writer to synchronously write the sort input.
ProcessStreamWriter = process.StandardInput;
% Start the asynchronous read of the sort output stream.
process.BeginOutputReadLine();
%Prompt the user for 4 input text lines. Write each
%line to the redirected input stream of the sort command.
numInputLines = 0;
while(numInputLines ~= 4)
inputText = input('Enter a text line (or press the Enter key to stop):', 's');
numInputLines = numInputLines + 1;
if(~isempty(inputText))
ProcessStreamWriter.WriteLine(inputText);
end
end
disp('end of input stream');
%end the inputr stream to the sort command
ProcessStreamWriter.Close();
% wait for the sort process to write the sorted text lines
process.WaitForExit();
process.Close();
end
要处理CMD的任何输出,您需要:
function processOutputHandler(obj,event)
%collect the sort command output and print in command window
if(~isempty(event.Data))
disp(event.Data);
end
end
您可以使用流编写器同步写入排序输入。
processStreamWriter = process.StandardInput;
同样,我从前面提到的帖子中得到了这个,所以我不能对代码有任何赞誉,但我确实认为它能够完成你想要的东西。不幸的是,我很确定这将完成你所需要的。我目前在Windows平台上没有Matlab,或者我会对此进行测试。如果您需要有关在MATLAB中使用.NET代码的信息(如果您需要添加一些东西来建立.NET接口,则不能立即清楚)MathWorks提供了一些文档:http://www.mathworks.com/help/matlab/matlab_external/using-net-from-matlab-an-overview.html
希望这会有所帮助,或者让你开始。如果我错过了其他任何内容,请告诉我。
答案 1 :(得分:0)
您可以从ansys方面处理此问题。用 -B-R 启动它来读取python脚本。
从那里,您可以建立一些双向协议,例如轮询文件,或者更好的方法是从python运行Web服务器。
然后,您可以从matlab与正在运行的ansys实例进行通信。如果您选择Web服务器,则使用MATLABs urlread()。
使用python设置Web服务器很简单,但您必须学习如何将命令分派给托管ansys应用程序。