2013-07-05 15 views
9

Po uruchomieniu msbuild w wierszu poleceń pokazuje ładne kolory w konsoli.Jak zachować kolory z pliku msbuild?

Jednak po uruchomieniu go z C# z Process.Start, wynik jest czarno-biały. Jak mogę zachować kolory?

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

Ponadto, skoro już tu jesteśmy, to ma znaczenie niż biegnę Process.Start przed BeginOutputReadLine? Czy jakiekolwiek dane wyjściowe zostaną utracone?


Motywacja, dla zainteresowanych. Projekt, nad którym pracuję wykorzystuje niestandardowe narzędzie do budowania (ponowne wynalezienie koła imho). Używa msbuild, ale za zawiłymi warstwami pośrednimi (uproszczony model powyżej). Pomocne kolory Msbuild zostaną utracone. Chciałbym je zapisać.

+0

Widzę, że otworzyłeś nagrodę ... Daj nam znać, jaki aspekt tego pytania Hans Passant nie odpowiedział w wystarczającym stopniu? A może zacząłeś nagrodę, by mu ją nagrodzić? –

+1

@CodyGray Hans mówi, że to niemożliwe. Chciałbym, żeby to było możliwe. –

+0

Niestety, ma rację. Nie ma sposobu na zrobienie tego "OutputDataReceived". Wszystkie wyniki to tekst, a nie kolory. Jeśli chcesz kolory, musisz przeanalizować dane i zastosować je ręcznie, tak jak mówi. Być może zainteresuje Cię rozszerzenie [VSColorOutput] (http://visualstudiogallery.msdn.microsoft.com/f4d9c2b5-d6d7-4543-a7a5-2d7ebabc2496), które robi to za Ciebie. –

Odpowiedz

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

Process.OutputDataReceived czyta tekst, a nie kolory. Funkcja przekierowania wyjścia, która znajduje się poniżej tego jedynego przekierowania standardowego tekstu, a nie atrybutów koloru konsoli. Otrzymujesz dokładnie to samo, gdy uruchamiasz msbuild z operatorem przekierowania > z wiersza poleceń, aby wysłać jego dane wyjściowe do pliku tekstowego. Oczywiście zobaczysz tekst bezbarwny po otwarciu pliku tekstowego w Notatniku.

Analizowanie przekierowanych danych wyjściowych w celu zmiany koloru własnych danych wyjściowych jest drastycznie niepraktyczne. Utknąłeś z nijaką. Z drugiej strony, programiści nie narzekają często na wygląd okna listy błędów w IDE :)

+0

Myślałem, że to możliwe. Co dzieje się z 'RedirectStandardOutput = false'? –

+0

Oczywiście, jeśli nie przekierowujesz wyjścia, MSBuild ponownie zapisuje na konsoli. I nic nie zobaczysz, odkąd kazałeś mu nie tworzyć konsoli. –

1

Nie wiem, w jaki sposób można to zrobić specjalnie dla msbuild ze wszystkimi ostrzeżeniami/błędami/innymi rzeczami, które mają różne kolory, ale można zmienić kolor konsoli, używając Console.ForegroundColor = ConsoleColor.Red; przed napisaniem do niego i zresetować z Console.ResetColor();

Aby zmienić subskrypcję ErrorDataRecieved, należy zmienić kolor na czerwony przed napisaniem, a następnie zresetować kolor po zapisaniu danych wyjściowych.

4

To jest, nie ma innego sposobu, aby to zrobić. Twój kod najpierw rozpoczyna proces, a następnie dołącza moduł obsługi zdarzenia. Być może niektóre dane zostaną utracone, ale zależy to od tego, jak szybko procesor przetworzy kod. Powinieneś najpierw lepiej dołączyć moduł obsługi zdarzenia, a następnie rozpocząć proces. (zobacz poniżej)