Process.StandardOutput停止阅读

时间:2018-03-28 15:02:49

标签: c#

我正在尝试运行一个进程,隐藏其窗口,然后在我的程序中打印它的输出。我用这段代码实现了它:

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = path,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        Verb = "runas"
     }
};

proc.Start();

while(!proc.StandardOutput.EndOfStream)
{
    string line = proc.StandardOutput.ReadLine();
    Console.WriteLine(line);
}

它适用于其他程序,但对于这个程序,它在某个时刻停止。我的猜测是它发送了太多消息,因为在实际加载之前它会发出大量消息,说:"正在初始化... n%"。它读取它直到达到约90-95%然后停止读取。我的猜测是它不能再读了,因为它发送了太多的消息。我该怎么做才能阅读整个输出?

2 个答案:

答案 0 :(得分:0)

我发现了如何制定解决方法。事实证明,程序实际上需要在初始化和实际结果之间输入。感谢@Alexandru Clonțea我决定不运行该过程,而是创建一个.bat文件,其中包含以下命令:

program.exe > output.txt < input.txt

如果program.exe是可执行文件,output.txt是包含程序输出的文件,在我的情况下,input.txt只是一个空文本文件,所以我可以得到某种输入并使程序完成。

答案 1 :(得分:-1)

我怀疑在监控标准输出时你从不退出的程序会写一个Write(&#34; Finished&#34;)而不是WriteLine(&#34; Finished&#34;)或者期望输入与其他人建议的一样,意味着&#39;目标&#34;程序永远不会退出。就像你从控制台做一个ReadLine永远不会完成直到&#34;输入&#34;按下,产生有价值的chr(13)chr(10)序列。第二个程序是否在您的控制范围内 - 即您拥有源代码吗?这听起来像是进行进程间同步的坏方法。

您可以尝试使用此代码来改善这种情况:

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = path,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true,
        Verb = "runas"
     }
};

proc.Start();

while(!proc.StandardOutput.EndOfStream)
{
    Console.Write((char)proc.StandardOutput.Read());
}

注意:这不会解决您的等待输入问题。虽然有问题!

如果您的目标是查看程序的结果,您应该检查proc.ExitCode,退出代码是在命令行工具世界中传达结果的方式。同时检查命令行中可能消除&#34;按任意键继续&#34;提示。 (即-silent)如果所有其他方法都失败了,你当然可以在按键中输入。 (见Redirecting command input using <