"StandardOut не был перенаправлен или процесс еще не начался" при чтении вывода консольной команды в C#

спасибо @user2526830 за код. На основе этого кода я добавил несколько строк в свою программу, так как я хочу прочитать вывод команды SSH. Ниже приведен мой код, который дает ошибку в строке while

StandardOut не был перенаправлен или процесс еще не начался.

чего я хочу достичь, так это того, что я хочу прочитать вывод ls в строку.

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:plink.exe";
startinfo.Arguments = "-ssh abc@x.x.x.x -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();

2 ответов


попробуйте установить стандартное перенаправление вывода перед началом процесса.

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

возможно, процесс уже завершен, когда вы пытаетесь прочитать вывод (взносы в команду "выход"). Попробуйте ниже слегка измененную версию, где я переместил ваш цикл while после команды "ls", но перед командой" exit".

Он должен прочитать вывод вашей команды "ls" отлично, но, к сожалению, скорее всего, зависнет в какой-то момент, поскольку вы никогда не получите EndOfStream на StandardOutput. Когда больше нечего читать, ReadLine будет блокировать, пока не сможет прочтите еще одну строчку.

поэтому, если вы не знаете, как обнаружить последнюю строку вывода, сгенерированную вашей командой, и выйти из цикла после ее чтения, вам может потребоваться использовать отдельный поток для чтения или для записи.

ProcessStartInfo startinfo = new ProcessStartInfo();
startinfo.FileName = @"f:\plink.exe";
startinfo.Arguments = "-ssh abc@x.x.x.x -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();