2016-06-08 31 views
5

Danke an @ user2526830 für den Code. Aufgrund dieses Codes habe ich meinem Programm einige Zeilen hinzugefügt, da ich die Ausgabe des SSH-Befehls lesen möchte. Unten ist mein Code, der in Zeile einen Fehler gibt hat while"StandardOut wurde nicht umgeleitet oder der Prozess wurde noch nicht gestartet" beim Lesen der Konsolenbefehlsausgabe in C#

StandardOut nicht umgeleitet wurde oder der Prozess noch nicht begonnen hat.

Was ich erreichen möchte ist, dass ich die Ausgabe von ls in eine Zeichenfolge lesen möchte.

Antwort

8

Versuchen Sie, vor dem Starten des Prozesses die Standardausgabeumleitung festzulegen.

process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 
0

Es könnte sein, dass der Prozess bereits beendet, wenn Sie versuchen, den Ausgang (Gebühren zu Ihrem „exit“ Befehl) zu lesen. Versuchen Sie die unten leicht modifizierte Version, wo ich Ihre while-Schleife nach dem "ls" -Befehl aber vor dem "exit" -Befehl bewegt habe.

Es sollte die Ausgabe von Ihrem "ls" Befehl gut lesen, aber leider wird es wahrscheinlich irgendwann hängen, da Sie EndOfStream nie auf dem StandardOutput erhalten werden. Wenn nichts mehr zu lesen ist, blockiert ReadLine, bis eine weitere Zeile gelesen werden kann.

Wenn Sie also nicht wissen, wie Sie die letzte Zeile der von Ihrem Befehl generierten Ausgabe erkennen und nach dem Lesen aus der Schleife ausbrechen können, müssen Sie möglicherweise einen separaten Thread zum Lesen oder zum Schreiben verwenden.

ProcessStartInfo startinfo = new ProcessStartInfo(); 
startinfo.FileName = @"f:\plink.exe"; 
startinfo.Arguments = "-ssh [email protected] -pw abc123"; 
Process process = new Process(); 
process.StartInfo = startinfo; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardInput = true; 
process.StartInfo.RedirectStandardOutput = true; 
process.Start(); 
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp"); 

while (!process.StandardOutput.EndOfStream) 
{ 
    string line = process.StandardOutput.ReadLine(); 
} 

process.StandardInput.WriteLine("exit"); 
process.WaitForExit(); 
Console.ReadKey();