13

コマンド ラインで msbuild を実行すると、コンソールにきれいな色が表示されます。

ただし、C# から実行するとProcess.Start、出力が白黒で表示されます。色を維持するにはどうすればよいですか?

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();
}

また、私たちがここにいる間、私がProcess.Start以前 に走ったよりも問題がありBeginOutputReadLineますか? 出力は失われますか?


モチベーション、興味のある方へ。私が取り組んでいるプロジェクトでは、カスタム ビルド ツールを使用しています (車輪の再発明)。msbuild を使用しますが、複雑な間接レイヤーの背後にあります (上記の単純化されたモデル)。msbuild の便利な色が失われます。私はそれらを保存したいと思います。

4

4 に答える 4

8
   p.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);

Process.OutputDataReceived は、色ではなくテキストを読み取ります。この下にある出力リダイレクト機能は、コンソールの色属性ではなく、stdout テキストのみをリダイレクトします。>コマンド ラインからリダイレクト オペレーターを使用して msbuild を実行し、その出力をテキスト ファイルに送信すると、まったく同じ結果が得られます。もちろん、テキスト ファイルをメモ帳で開くと、何の変哲もないテキストが表示されます。

リダイレクトされた出力を解析して独自の出力の色を変更することは、非常に非現実的です。あなたは味気なく立ち往生しています。繰り返しになりますが、プログラマーは IDE のエラー リスト ウィンドウのルック アンド フィールについて不満を言うことはあまりありません :)

于 2013-07-05T16:43:54.253 に答える
4

それだけです、それを行う他の方法はありません。コードは最初にプロセスを開始し、次にイベント ハンドラを追加します。そのため、失われるデータがあるかもしれませんが、それは CPU がコードを処理する速度に依存します。最初にイベントハンドラを追加してから、プロセスを開始することをお勧めします。(下記参照)

using (var p = new Process())
{
    p.StartInfo = new ProcessStartInfo("msbuild")
    {
        UseShellExecute = false,
        CreateNoWindow = true,
        RedirectStandardError = true,
        RedirectStandardOutput = true,
    };
    p.ErrorDataReceived += (s, e) => ErrorLine(e.Data);
    p.OutputDataReceived += (s, e) => OutputLine(e.Data);
    p.BeginErrorReadLine();
    p.BeginOutputReadLine();
    p.Start();
    p.WaitForExit();
}
void ErrorLine(string text)
{
    Console.ForegroundColor = ConsoleColor.White;
    Console.BackgroundColor = ConsoleColor.DarkRed;
    Console.Error.WriteLine(text);
    Console.ResetColor();
}
void OutputLine(string text)
{
    Console.Error.WriteLine(text);
}
于 2013-07-22T10:21:40.727 に答える
1

さまざまな色を行うすべての警告/エラー/その他のものを含むmsbuildに対してこれを具体的に行う方法についてはわかりませんが、Console.ForegroundColor = ConsoleColor.Red;書き込む前に使用してコンソールの色を変更し、リセットすることができますConsole.ResetColor();

したがって、ErrorDataRecieved サブスクリプションを変更して、書き込む前に色を赤に変更し、出力を書き込んだ後に色をリセットします。

于 2013-07-05T16:33:19.863 に答える