Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Process.StandardOutput停止读取_C# - Fatal编程技术网

C# Process.StandardOutput停止读取

C# Process.StandardOutput停止读取,c#,C#,我试图运行一个进程,隐藏它的窗口,然后在我的程序中打印它的输出。我通过以下代码实现了这一点: var proc = new Process { StartInfo = new ProcessStartInfo { FileName = path, UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true,

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

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%左右,然后停止读取。我的猜测是它不能再阅读了,因为它发送了太多的信息。如何读取整个输出?

我怀疑您在监视标准输出时从未退出的程序执行写入(“完成”)而不是写入线(“完成”),或者像其他人建议的那样期望输入,这意味着“目标”程序永远不会退出。就像您从控制台执行读取线一样,在“进入”之前从未完成按下,生成有价值的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,退出代码是命令行工具世界中传达结果的方式。还要检查命令行中是否有可能消除“按任意键继续”提示的标志。(即-无声)如果所有其他方法都失败,您当然可以在按键中插入管道。(请参阅使用重定向命令输入。我找到了解决方法。结果表明,在初始化和实际结果之间,程序实际上需要输入。由于我决定不运行该过程,而是创建一个.bat文件,其中包含以下命令:

program.exe > output.txt < input.txt
program.exe>output.txt

其中program.exe是可执行文件,output.txt是包含程序输出的文件,input.txt在我的例子中只是一个空文本文件,这样我就可以得到某种输入并使程序完成。

你有什么错误吗?
我猜它不能再读取了,因为它发送了太多的消息ode>为什么这是你的第一个假设?阅读完这些评论后,我认为你会陷入僵局。尝试异步阅读,或者使用WaitForExit()来阅读你也应该从标准错误中读取。你必须先省略CealtEndoDuWork=真的赋值来解决这个问题。这样你就可以看到程序显示的任何错误信息。接下来你必须考虑它可能需要输入。“初始化…92%"并且停止。编辑:在复制实际的进程窗口时,它做得更好,因为控制台不断地清除自身,并且显示一条消息,而不是像我的代码那样滥发消息。程序总是返回0,并且我没有问题的源代码。如果我有,我已经修复了我的问题。Th重点是,我只能使用它打印的消息来确定发生了什么。@TsvetomirBonev调用没有重定向输出的程序做什么?这真的很奇怪。我尝试在CMD中运行以下命令:
program.exe>output.txt
。它做了同样的事情-初始化消息结束时停止输出,may问题是否不在我的代码中?您建议的命令有效,只是创建了一个名为test.txt的空文本文件并运行了您发送的命令,输出已正确创建。谢谢,我可能只创建一个.bat文件来执行此操作,而不是运行.exe文件。请注意其他“情况”在这种方法的未来,您可能实际上需要有多行作为输入,而不是一个空文件。