2016-06-08 10 views
5

Dzięki @ user2526830 dla kodu. Na podstawie tego kodu dodałem kilka wierszy do mojego programu, ponieważ chcę odczytać wynik polecenia SSH. Poniżej znajduje się mój kod, który daje błąd w linii while"StandardOut nie został przekierowany lub proces jeszcze się nie rozpoczął" podczas czytania wyniku polecenia konsoli w C#

StandardOut nie został przekierowany lub proces jeszcze się nie rozpoczął.

Co chcę osiągnąć to to, że chcę odczytać wyjście ls na ciąg znaków.

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

Odpowiedz

8

Spróbuj ustawić standardowe przekierowanie wyjścia przed rozpoczęciem procesu.

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

Możliwe, że proces już się zakończył podczas próby odczytania danych wyjściowych (opłaty za polecenie "exit"). Spróbuj poniżej nieco zmodyfikowanej wersji, w której przeniosłem twoją pętlę po poleceniu "ls", ale przed poleceniem "exit".

Powinien odczytać wynik polecenia "ls" dobrze, ale niestety najprawdopodobniej zawiesi się w pewnym momencie, ponieważ nigdy nie otrzymasz EndOfStream na StandardOutput. Gdy nie ma nic więcej do czytania, ReadLine będzie blokować, dopóki nie będzie można odczytać innej linii.

Więc jeśli nie wiesz, jak wykryć ostatni wiersz danych wyjściowych wygenerowanych przez polecenie i przerwać pętlę po przeczytaniu, może być konieczne użycie osobnego wątku do czytania lub pisania.

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(); 
Powiązane problemy