【问题标题】:Process not working进程不工作
【发布时间】:2011-08-27 10:05:45
【问题描述】:

我尝试使用以下代码调用进程(控制台应用程序):

       ProcessStartInfo pi = new ProcessStartInfo();
        pi.UseShellExecute = false;
        pi.RedirectStandardOutput = true;
        pi.CreateNoWindow = true;
        pi.FileName = @"C:\fakepath\go.exe";
        pi.Arguments = "FOO BAA";
        Process p = Process.Start(pi);
        StreamReader streamReader = p.StandardOutput;
        char[] buf = new char[256];
        string line = string.Empty;
        int count;
        while ((count = streamReader.Read(buf, 0, 256)) > 0)
        {
            line += new String(buf, 0, count);
        }

它仅适用于某些情况。 不起作用的文件大小为 1.30 mb, 我不知道这是否是它无法正常工作的原因。 line 返回一个空字符串。 我希望这很清楚。 有人可以指出我的错误吗?提前致谢。

【问题讨论】:

  • 失败的表现形式是什么?
  • 对于这种情况,返回一个空字符串。我用 PHP 的 exec() 函数(调用相同的进程)进行了测试,工作正常。
  • 不懂 C#,这不是问题,但在包含 BAA 的行中似乎存在不平衡的 "
  • 对不起,因为我在这里编辑了文本框中的一些变量。固定的。但代码仍然无法正常工作。
  • 如果您手动对该文件执行命令,您会得到非空结果吗?另外,您是否可以编辑您的问题以准确添加您遇到的失败,而不是将其留在 cmets 中?

标签: c# .net process


【解决方案1】:

几个想法:

  1. streamreader 的各种 Read* 方法要求您确保您的应用在运行之前已完成,否则您可能无法获得输出,具体取决于时间问题。如果您想使用此路由,您可能需要查看 Process.WaitForExit() 函数。

    另外,除非您有分配缓冲区的特定原因(IMO 中的痛点),否则我只会在循环中使用 readline(),或者由于进程已退出,使用 ReadToEnd() 来获取整个输出。两者都不需要你必须做 char 数组,这会使你面临缓冲区大小的数学错误。

  2. 如果您想在运行时进行异步并转储输出,您将需要使用 BeginOutputReadLine() 函数(请参阅 MSDN)

  3. 不要忘记错误的处理方式不同,因此如果您的应用出于任何原因正在写入 STDERR,您还需要使用适当的错误输出函数来读取该输出。

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 2013-06-10
    • 2011-10-31
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多