Warum würde C # ProcessStartInfoRedirectStandardOutput dazu führen, dass der xcopy-Prozess fehlschlägt

8

Das ist ein bisschen peinlich, weil ich jetzt nicht den Code vor mir habe, aber ich versuche es zu erklären.

Ich habe eine einfache C # -Anwendung, die ein Ruby-Skript startet (es macht ein paar andere Dinge, also erzeugt es eine Batch-Datei und führt diese aus).

Ich verwende das C # -Prozessobjekt und setze folgendes redirectstandardoutput = true redirectstandarderror = wahr UseShellExecute = false CreateNoWindow = true (schönes Bit der Rückwärtslogik!)

Ich erstelle dann zwei Threads und lese ReadLine () sowohl für die Fehler- als auch für die Ausgabe-Streams ab und warte darauf, dass beide beendet werden, bevor ich WaitForExit () aufruft.

Nun, egal, was ich mache, mein Ruby-Skript kann einen Systembefehl ("xcopy ...") nicht aufrufen, wenn ich die Ausgabe umleitung (es werden keine Fehler erzeugt, es wird einfach nicht kopiert). Es kopiert auch keine anderen Dateien, die ich kopieren möchte.

Dies passiert, wenn ich beide Streams an einen Thread leite, nur einen von ihnen umleite und einfach ReadToEnd () aufrufen.

Es funktioniert nur korrekt, wenn ich redirectstandardoutput und redirectstandartrorror auf false setze.

Ich bin hier völlig am Ende. Ich dachte, vielleicht wurde der Ausgabestream gefüllt, aber ich kann mir nicht vorstellen, warum, wenn ich ReadLine anrufe (ich brauche Zeile lesen, damit ich jede Zeile parsen kann und relevante nur dem Endbenutzer präsentiere). Ich dachte auch, dass das Aufrufen von DOS-Befehlen aus einem Thread-C # -Prozess Probleme verursachen könnte.

Hat jemand eine Idee was hier vor sich geht? Ich sollte sagen, ich bin auf VS. Net 2005, die ich denke, ist das .Net Framework 2.0.

    
Lee Winder 20.02.2009, 00:56
quelle

1 Antwort

9

Es gibt einen obskuren Post auf der MSDN Foren , die darauf hindeuten, dass es möglicherweise einen Fehler mit XCOPY selbst gibt - wenn Sie XCOPYs STDOUT umleiten, müssen Sie auch STDIN umleiten.

( Hinweis: Ich markiere dies als Community-Wiki, also könnte jemand, der Ruby kennt, einen Beispielcode schreiben, um STDIN für system () umzuleiten)

    
Alex Lyman 20.02.2009, 04:57
quelle

Tags und Links