繁体   English   中英

Process.StandardOutput停止读取

[英]Process.StandardOutput stops reading

我试图运行一个进程,隐藏其窗口,然后在程序中打印其输出。 我用以下代码实现它:

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%,然后停止读取。 我的猜测是它无法发送信息,因为它发送了太多消息。 我该怎么做才能读取整个输出?

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

program.exe > output.txt < input.txt

其中program.exe是可执行文件,output.txt是将包含程序输出的文件,而在我的情况下,input.txt只是一个空文本文件,因此我可以获取某种输入并进行程序完成。

我怀疑您在监视标准输出时不会退出的程序执行Write(“ Finished”)而不是WriteLine(“ Finished”)或期望其他建议的输入,这意味着“目标”程序永不退出。如果您从控制台执行ReadLine,直到按下“ Enter”键,直到生成有价值的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,退出代码是在命令行工具世界中传达结果的方法。 还要在命令行中检查是否有可能消除“按任意键继续”提示的标志。 (即-silent)如果所有其他方法都失败了,那么您当然可以按入按键。 (请参阅使用<重定向命令输入

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM