2016-06-08 25 views
5

Grazie a @ user2526830 per il codice. Basato su quel codice ho aggiunto poche righe al mio programma poiché voglio leggere l'output del comando SSH. Qui di seguito è il mio codice che dà un errore alla linea while"StandardOut non è stato reindirizzato o il processo non è ancora stato avviato" durante la lettura dell'output del comando della console in C#

StandardOut non è stato reindirizzato o il processo non è ancora iniziata.

Quello che voglio ottenere è che voglio leggere l'output di ls in una stringa.

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.Start(); 
process.StandardInput.WriteLine("ls -ltr /opt/*.tmp"); 
process.StandardInput.WriteLine("exit"); 

process.StartInfo.RedirectStandardOutput = true; 

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

process.WaitForExit(); 
Console.ReadKey(); 

risposta

8

Provare a impostare il reindirizzamento dell'output standard prima di iniziare il processo.

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

Potrebbe essere che il processo sia già terminato quando si tenta di leggere l'output (quote per il comando "exit"). Prova la versione leggermente modificata di seguito in cui ho spostato il tuo ciclo while dopo il comando "ls" ma prima del comando "exit".

Dovrebbe leggere l'output del comando "ls", ma sfortunatamente probabilmente si bloccherà ad un certo punto in quanto non si otterrà mai EndOfStream su StandardOutput. Quando non c'è più nulla da leggere, ReadLine bloccherà fino a quando non potrà leggere un'altra riga.

Quindi, a meno che non si sappia come rilevare l'ultima riga dell'output generato dal comando e interrompere l'anello dopo averlo letto, potrebbe essere necessario utilizzare un thread separato per la lettura o la scrittura.

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(); 
Problemi correlati