2013-07-05 10 views
9

コマンドラインでmsbuildを実行すると、コンソールにかなりの色が表示されます。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(); 
} 

、私たちがここにいる間、私はBeginOutputReadLineProcess.Startを実行するよりも、それは問題ではありませんか?出力は失われますか?


動機づけ、興味のある方。私が取り組んでいるプロジェクトでは、カスタムビルドツール(ホイールimhoの再発明)を使用しています。 msbuildを使用していますが、間接的な階層の背後にあります(上記の単純化モデル)。 Msbuildの有益な色が失われます。私はそれらを救いたいです。

+0

私は賞品を開いたことがわかります。この質問のどの側面がHans Passantの回答で十分にカバーしていないか教えてください。それとも、彼に賞金を授与し始めたのですか? –

+1

@CodyGray Hansはそれは不可能だと言います。私はそれが可能であることを望みます。 –

+0

残念ながら、彼は正しいです。 'OutputDataReceived'にこれを行う方法はありません。出力されるのは、色ではなくテキストです。色を使いたい場合は、データを解析して手動で適用する必要があります。 [VSColorOutput](http://visualstudiogallery.msdn.microsoft.com/f4d9c2b5-d6d7-4543-a7a5-2d7ebabc2496)拡張機能に興味があります。 –

答えて

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

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

リダイレクトされた出力を解析して自分自身の出力を再表示することは非常に実用的ではありません。あなたはまばゆいです。次に、プログラマは、IDEのエラーリストウィンドウのルックアンドフィールについて頻繁に文句を言うことはありません:)

+0

これは考えられるかもしれません。 'RedirectStandardOutput = false'はどうなりますか? –

+0

出力をリダイレクトしないと、MSBuildは再びコンソールに書き込みます。コンソールを作成しないように指示してからは、何も表示されません。 –

1

どのように警告/エラー/色の異なるその他のものがmsbuildに対してどうして起こるか分かりませんが、書き込む前にConsole.ForegroundColor = ConsoleColor.Red;を使ってコンソールの色を変更してリセットすることはできますConsole.ResetColor();

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

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); 
} 
関連する問題