4

How can I set up two external executables to run from a c# application where stdout from the first is routed to stdin from the second?

I know how to run external programs by using the Process object, but I don't see a way of doing something like "myprogram1 -some -options | myprogram2 -some -options". I'll also need to catch the stdout of the second program (myprogram2 in the example).

In PHP I would just do this:

$descriptorspec = array(
            1 => array("pipe", "w"),  // stdout
        );

$this->command_process_resource = proc_open("myprogram1 -some -options | myprogram2 -some -options", $descriptorspec, $pipes);

And $pipes[1] would be the stdout from the last program in the chain. Is there a way to accomplish this in c#?

Matthew
  • 685
  • 8
  • 18
  • If you're doing a lot of this type of code, you might want to check out Windows PowerShell. – TrueWill Aug 28 '09 at 23:10
  • I'm actually doing this in Linux, but thanks for the tip! – Matthew Aug 31 '09 at 12:30
  • I never knew about the pipe operator and I logged in just to tell you THANK YOU for that. It is an amazing operator. http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true – jocull Mar 04 '10 at 00:50

3 Answers3

12

Here's a basic example of wiring the standard output of one process to the standard input of another.

Process out = new Process("program1.exe", "-some -options");
Process in = new Process("program2.exe", "-some -options");

out.UseShellExecute = false;

out.RedirectStandardOutput = true;
in.RedirectStandardInput = true;

using(StreamReader sr = new StreamReader(out.StandardOutput))
using(StreamWriter sw = new StreamWriter(in.StandardInput))
{
  string line;
  while((line = sr.ReadLine()) != null)
  {
    sw.WriteLine(line);
  }
}
scottm
  • 27,829
  • 22
  • 107
  • 159
0

You could use the System.Diagnostics.Process class to create the 2 external processes and stick the in and outs together via the StandardInput and StandardOutput properties.

Mischa
  • 893
  • 5
  • 7
  • 1
    I don't think this actually works. The properties you mention are read-only. So if by 'stick the in and out together' you mean some sort of assignment like `proc2.StandardInput = proc1.StandardOutput;`, then I believe this is a non-answer. Perhaps you can clarify. – Wil S Jul 08 '13 at 21:48
  • How to stick input and output? – sorosh_sabz Mar 23 '23 at 14:07
0

Use System.Diagnostics.Process to start each process, and in the second process set the RedirectStandardOutput to true, and the in the first RedirectStandardInput true. Finally set the StandardInput of the first to the StandardOutput of the second . You'll need to use a ProcessStartInfo to start each process.

Here is an example of one of the redirections.

Preet Sangha
  • 64,563
  • 18
  • 145
  • 216
  • Same comment as on @Mischa's post. Not only are the StandardInput and StandardOutput properties read-only, but they are of different types (StreamWriter and StreamReader, respectively). So you can't assign them (to each other). – Wil S Jul 08 '13 at 21:50