【问题标题】:Command prompt output being read as empty string命令提示符输出被读取为空字符串
【发布时间】:2012-06-19 01:48:25
【问题描述】:

我正在尝试执行命令提示符命令并读取 C# 中的输出。这是我的代码:

ProcessStartInfo cmdInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
cmdInfo.CreateNoWindow = true;
cmdInfo.RedirectStandardOutput = true;
cmdInfo.UseShellExecute = false;

Process cmd = new Process();
cmd.StartInfo = cmdInfo;
cmd.Start();
string result = cmd.StandardOutput.ReadToEnd();
cmd.WaitForExit();
cmd.Close();
return result;

它在大多数情况下都有效,但有时 result="" 对于我正在使用的命令来说是不可能的(例如, route add 应该在成功或失败时给出输出)。有任何想法吗?我想知道我是否在进程和 ReadToEnd 调用之间创建了竞争条件?

【问题讨论】:

    标签: c# command-prompt


    【解决方案1】:

    并非所有输出都写入 StandardOutput;如果出现问题,许多应用程序将改为写入 StandardError。您必须从两者中读取才能获得所有输出。

    只要应用程序从不阻塞输入,就应该安全地在两个输出流上调用ReadToEnd() 以获取所有输出。然而,更安全的选择是将事件连接到OutputDataReceivedErrorDataReceived 事件。您可以将 lambda 表达式附加到这些关闭局部变量的变量上,以使事情变得非常简单:

    var output = new StringBuilder();
    var error = new StringBuilder();
    
    cmd.OutputDataReceived += (o, e) => output.Append(e.Data);
    cmd.ErrorDataReceived += (o, e) => error.Append(e.Data);
    
    cmd.Start();
    cmd.BeginOutputReadLine();
    cmd.BeginErrorReadLine();
    cmd.WaitForExit();
    

    【讨论】:

    • 太棒了!有了这个,我的问题就完美解决了。不过我很好奇,当命令成功时,为什么“OK!”写入标准错误?
    • 应用程序可以将它想要的任何内容写入它想要的任何输出流。通常,命令行实用程序将状态消息写入标准错误,因为标准输出经常被重定向到文件;如果您想解析它,stderr 上的“OK”消息仍会显示在屏幕上,但不会出现在输出中。
    • 啊,基本上是因为好的!脱离上下文没有用。我认为这一切都有道理,谢谢!
    • 我不明白你如何访问生成的输出
    • 人...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多