2009-08-17 11 views
11

Ich versuche, einen Prozess in C# mit der Process-Klasse auszuführen.C# redirect (pipe) Prozessausgabe zu einem anderen Prozess

Process p1 = new process(); 
p1.startinfo.filename = "xyz.exe"; 
p1.startinfo.arguments = //i am building it based on user's input. 
p1.start(); 

Also basierend auf Benutzereingaben baue ich den Argumentwert. Jetzt habe ich einen Fall, wo ich die Ausgabe von p1 zu einem anderen Prozess, sagen wir grep, leiten muss. also habe ich das im Grunde versucht

p1.startinfo.arguments = "-info | grep 1234";

was soll i ist so etwas wie xyz.exe -info | grep 1234

aber dies scheint nicht in .net zu arbeiten .. Ich kann tatsächlich eine andere Prozessvariable und run „grep“ als separate erstellen Prozess .. Aber ich fragte mich, ob es einen Weg zu tun gibt, wie iam oben ausprobieren.

+0

Ich fand diesen Blog-Artikel, der genau diese Frage behandelt: [Verwenden pipeed Ausgabeumleitung auf den Process/ProcessStartInfo-Klassen ...] (http://weblogs.asp.net/justin_rogers/archive/2004/02/27/ 81370.aspx) –

+0

Wenn Sie CMD nicht verwenden möchten, lesen Sie die [MedallionShell] (https://github.com/madelson/MedallionShell) -Bibliothek. Es vereinfacht die Prozessdatenumleitung (und andere Aspekte der Prozessverwaltung) erheblich. – ChaseMedallion

Antwort

19

Der viel einfachere Weg wäre, nur cmd als Ihr Prozess zu verwenden.

Process test = new Process(); 
test.StartInfo.FileName = "cmd"; 
test.StartInfo.Arguments = @"/C ""echo testing | grep test"""; 
test.Start(); 

Sie können die Ausgabe oder was auch immer Sie sonst wie einen normalen Prozess erfassen möchten. Dies war nur ein kurzer Test, den ich erstellt habe, aber es funktioniert, indem ich Tests an die Konsole austausche, also würde ich erwarten, dass dies für alles andere, was Sie mit der Pipeline machen wollen, funktionieren würde. Wenn der Befehl geöffnet bleiben soll, verwenden Sie/K anstelle von/C und das Fenster wird nicht geschlossen, wenn der Prozess abgeschlossen ist.

+0

Danke, dass du meinen Tag gerettet hast :) – FatDaemon

+1

Ich muss dasselbe ohne cmd unter Linux machen. Wie kann ich den StreamReader des Quellprozesses mit dem StreamWriter des Zielprozesses verbinden? –

+1

und wie geht das unter Linux? :) – knocte

Verwandte Themen