views:

168

answers:

3

Hi there.

I'm currently trying to get the output of an executable console-app into an other one. To be exact, a little overview of what I'm trying to do:

I have one executable which I cannot edit and neither see it's code. It writes some (quite a bunch to be honest) lines into the console when executed.

Now I want to write another executable that starts the one above and reads the things it writes.

Seems simple to me, so I started coding but ended up with an error message saying that StandardOut has not been redirected or the process hasn't started yet.

I tried it using this kinda structure (C#):

Process MyApp = Process.Start(@"C:\some\dirs\foo.exe", "someargs");
MyApp.Start();
StreamReader _Out = MyApp.StandardOutput;

string _Line = "";

while ((_Line = _Out.ReadLine()) != null)
    Console.WriteLine("Read: " + _Line);

MyApp.Close();

I can open the executable and it also does open the one inside, but as soon as it comes to reading the returned values, the app crashes.

What am I doing wrong?!

+2  A: 

Take a look at the documentation for the Process.StandardOutput property. You will need to set a boolean indicating that you want the stream redirected as well as disabling shell execute.

Note from the documentation:

To use StandardOutput, you must set ProcessStartInfo..::.UseShellExecute to false, and you must set ProcessStartInfo..::.RedirectStandardOutput to true. Otherwise, reading from the StandardOutput stream throws an exception

You would need to change your code a little bit to adjust for the changes:

Process myApp = new Process(@"C:\some\dirs\foo.exe", "someargs");
myApp.StartInfo.UseShellExecute = false;
myApp.StartInfo.RedirectStandardOutput = false;

myApp.Start();

string output = myApp.StandardOutput.ReadToEnd();
p.WaitForExit();
Qua
That was fast... sorry for not trying TFM first :( Will do better next time
ApoY2k
A: 

you could try setting processStartInfo.RedirectStandardOutput = true;

brysseldorf
A: 

As noted above, you can use RedirectStandardOutput as here.

Another, dirtier way is something like

using (Process child = Process.Start
  ("cmd", @"/c C:\some\dirs\foo.exe someargs > somefilename"))
  {
    exeProcess.WaitForExit();
  }

And then read its output from somefilename

yu_sha