【问题标题】:"StandardOut has not been redirected or the process hasn't started yet" when reading console command output in C#在 C# 中读取控制台命令输出时,“StandardOut 尚未重定向或进程尚未启动”
【发布时间】:2016-06-08 06:11:16
【问题描述】:

感谢@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();

【问题讨论】:

    标签: c# ssh plink


    【解决方案1】:

    在开始进程之前尝试设置标准输出重定向。

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

    【讨论】:

      【解决方案2】:

      当您尝试读取输出时,进程可能已经终止(由于您的“退出”命令)。试试下面稍微修改过的版本,我在“ls”命令之后但在“exit”命令之前移动了你的 while 循环。

      它应该可以很好地读取您的“ls”命令的输出,但很可能会在某个时候挂起,因为您永远不会在 StandardOutput 上获得 EndOfStream。当没有更多要读取的内容时,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();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-31
        • 2020-04-28
        相关资源
        最近更新 更多