Run exe with an input file and close upon process exit

24 views (last 30 days)
Hi,
I am creating a GUI where the user is to input parameters, MATLAB then creates an input file (exp.in) that is to be read into an exe. Once the cfd computations have completed, I would like the exe to close itself (if it is successful). I have the following created using similar queries by others however do not know how to go about passing the exe an input file.
proc = System.Diagnostics.Process();
proc.StartInfo.FileName = 'P:\path...cfd.exe';
%proc.StartInfo.Arguments = 'P:\path...exp.in';
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = true;
proc.Start();
StreamWriter = proc.StandardInput;
sIn.AutoFlush = true;
sIn.write("dir P:\path...exp.in")
sIn.write("exit")
sIn.Close()
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.0);
end
Is there a way to pass on an input file for the exe to use. I have tried to use arguments but it doesn't work. Research suggests controlling process input via streamwriter.
I can use the system command to do so but then don't know how to close the exe once it finishes (have used taskkill to no avail; it closes before the process finishes).
Thanks in advance!
  4 Comments
Muhammad Munib
Muhammad Munib on 3 Sep 2018
Sorry I meant that most of the answers given along with documentation use
system(cfd.exe < inputfile.in &')
With the &, it runs in its own command window, as I would like it to; without, it runs in the Matlab command window which I don't want. User should be able to see the computations and wait for them to complete.
The exe normally takes its input from the keyboard as you have stated and with '<' it accepts values sequentially. Beyond that it was written in Fortran, I would not know how it works, sorry. I've just been given the exe and am trying to create a GUI around it so users have something prettier to use than the command window as input.
The .Net code is from a similar query in Matlab Answers. I have tried to pass it arguments using
proc.StartInfo.Arguments = 'C:\inputFile.in';
to no avail. The rest of the code, as written in the original post works as I would like. So apart from the fact that it doesn't seem to read arguments (which may explain why with '-i' doesn't read the input, I think, I may be wrong) or I can't give it an input file to read using the stream writer, it closes after I manually enter inputs upon
if proc.HasExited
once the computations have finished.
Could I use
task = 'cfd.exe < inputfile.in'
[status, result] = system('cfd.exe < inputfile.in &');
and then write a while loop to identify when task has finished or would I have to gets its process ID.
Thanks. Appreciate any help.

Sign in to comment.

Accepted Answer

Guillaume
Guillaume on 3 Sep 2018
As I said in my comment, cfd.exe < inputfile.in does not pass any input argument to the executable. It's a completely different mechanism, and proc.StartInfo.Arguments = 'C:\inputFile.in'; is not equivalent to that at all. The .Net equivalent would be
proc.Start;
streamreader = System.IO.StreamReader('C:\inputfile.in');
proc.StandardInput.Write(streamreader.ReadToEnd);
With regards to &, I was too focused on the windows side and forgot that it's a matlab argument to mean that system should return immediately without waiting for the process to finish. So, if you want matlab to continue only when the process has finished then don't include that final &.
As to killing the process, if I understood correctly, you shouldn't have to do that as your program accepts a quit command that will tells it to terminate. It's a lot cleaner than killing it.
  3 Comments
Muhammad Munib
Muhammad Munib on 11 Sep 2018
I've got it to work, I hadn't closed the stream reader so the fopen could not actually write anything to the file. Thank you for your help, much appreciated.
streamreader.close()

Sign in to comment.

More Answers (1)

Fangjun Jiang
Fangjun Jiang on 14 Aug 2018
Try to run system() manually first or open a command window and then type in line by line
cfd.exe <exp.in
exit
  1 Comment
Muhammad Munib
Muhammad Munib on 3 Sep 2018
Sorry don't quite understand the steps.
Can I write something to exit the exe command window once it finishes its operations.
Thanks.

Sign in to comment.

Products


Release

R2017a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!