【发布时间】:2013-07-03 19:35:15
【问题描述】:
当我在命令行运行 msbuild 时,它会在控制台中显示漂亮的颜色。
但是,当我使用 Process.Start 从 C# 运行它时,输出显示为黑白。我怎样才能保持颜色?
var info = new ProcessStartInfo("msbuild")
{
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardError = true,
RedirectStandardOutput = true,
};
using (var p = Process.Start(info) )
{
p.ErrorDataReceived += (s, e) => Console.Error.WriteLine(e.Data);
p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
p.BeginErrorReadLine();
p.BeginOutputReadLine();
p.WaitForExit();
}
另外,当我们在这里时,我在 BeginOutputReadLine 之前运行 Process.Start 重要吗?是否会丢失任何输出?
动机,对于那些感兴趣的人。我从事的一个项目使用自定义构建工具(重新发明轮子恕我直言)。它使用 msbuild,但在复杂的间接层后面(上面的简化模型)。 Msbuild 有用的颜色丢失了。我想拯救他们。
【问题讨论】:
-
我看到你已经打开了一个赏金......想告诉我们这个问题的哪个方面 Hans Passant 的回答没有充分涵盖?还是你开始赏金给他了?
-
@CodyGray Hans 说这是不可能的。我希望它成为可能。
-
不幸的是,他是对的。没有办法让
OutputDataReceived这样做。它输出的只是文本,而不是颜色。如果你想要颜色,你必须解析数据并手动应用它们,就像他说的那样。您可能对 VSColorOutput 扩展感兴趣,它会为您完成这项工作。 -
我认为可以做到,但是您需要解析流并在流中收集 ANSI 转义码。实际上,您必须解释输出。 en.wikipedia.org/wiki/ANSI_escape_code 和 MSFT nodejstools 中的这个例子:github.com/Microsoft/nodejstools/blob/…
-
MSBuild 可能会这样做:stackoverflow.com/questions/8938679/…
标签: c# .net process system.diagnostics