2012-04-10 20 views
5

Niedawno znalazłem wpis, który dał rozwiązanie mieć wyjście tekstowe stderr inny kolor dla systemu Linux (bash)Zmień kolor tekstu wyjściowego w systemie Windows do stderr

stworzyli skrypt skrypt po bash

#!/bin/bash 
{ $* 2>&1>&3|sed 's,.*,\x1B[33m&\x1B[0m,'>&2;} 3>&1 

Powoduje to, że wyjście drukuje żółty tekst, gdy pochodzi ze stderr. stdout nadal drukuje ten sam kolor.

skrypt został zapisany w katalogu na $ PATH nazwie color. To pozwala mi uruchamiać skrypt za pomocą make lub scons, a to spowoduje, że cały tekst ze stderr będzie na żółto. (może zmienić tekst na 33-31m)

color make CPU=x64 

Jest to przydatne przy wyszukiwaniu błędów podczas kompilacji.

Czy istnieje podobny skrypt, który może być użyty dla powłoki cmd systemu Windows?

Uwaga: Zainstalowałem sed na moim komputerze z systemem Windows, jeśli jest to pomocne.

Odpowiedz

6

Jeśli chodzi o obsługę kodów escape ANSI w Windows cmd.exe systemu Windows, zobacz ansicon. Po przetłumaczeniu logiki przekierowania do składni cmd.exe przygotowałem następujące color.bat plik:

@Echo Off 
(((%* 1>&3) 2>&1) | "c:\Program Files (x86)\GnuWin32\bin\sed.exe" "s,.*,\x1B[33m&\x1B[0m," 1>&2) 3>&1 

Niestety strumienie mieszają (na niektórych liniach postacie z stdout i stderr są mieszane razem w jednej linii). Może to zachowanie zależy od wersji sed.exe, więc spróbuj.

Jeśli to nie zadziała, należy rozważyć użycie minimalnej instalacji cygwin. Przetestowałem Twój skrypt color.sh i mogłem uruchomić plik .bat, który działał poprawnie bez mieszania strumieni. Składnia Kiedyś było:

./color.sh cmd /c test.bat 
+0

dzięki ja nie jestem w moim komputerze już teraz, ale będę go dać spróbuj i daj znać. – gnash117

+0

Dzięki działa świetnie, ponieważ mam sed w mojej PATH Nie musiałem określić pełną ścieżkę pozostawiając @ Echo Off (((% * 1> & 3) 2> & 1) | "sed.exe" "s,. *, \ x1B [31m i \ x1B [0m, "1> i 2) 3> & 1 – gnash117

3

I opracowali metodę, aby uzyskać równoważne rozwiązanie używając czystych polecenia wsadowego, czyli nie ANSI nie sed.exe, etc., po prostu służy findstr:

any_command 2>&1 1>&3 | findstr /N /A:4E "^" 

W tym przypadku inny kolor nie jest podawany do całych linii od stderr, ale tylko do numeru linii dostarczanego przez findstr, który jednak powinien wystarczyć dla podanych wymagań. Wkrótce napiszę mały pomocniczy program .exe, który pokaże całe linie stderr w innym kolorze.

+0

Co to jest' i 3' ?? –

+0

W moim Win7 to polecenie powoduje kolorowanie linii, ale * tylko * wyjście stderr, stdout nie jest wyświetlane. –

2

@MBu @ gnash117

I przemianowany color do co od COLOR jest polecenia systemu Windows i rozszerzyła je na:

:: color output - Displays stderr output in different color 
:: 
:: Credits to MBu and gnash117 at http://stackoverflow.com/questions/10095886/change-text-output-color-on-windows-for-stderr#10118710 
:: 
:: Requires: 
:: - http://sourceforge.net/projects/mingw/files/MSYS/ 
:: - http://adoxa.altervista.org/ansicon/ 
:: - http://www.autohotkey.com/ 
:: 
@echo off 

if "%1"=="" goto :Help 

:: 1;31 ... intense red foreground (see https://github.com/adoxa/ansicon/blob/master/sequences.txt for more colors) 
:: \x07 ... BEL, but doesn't work :-(
(((%* 1>&3) 2>&1) | sed "s/.*/\x07\x1B[1;31m&\x1B[0m/" 1>&2) 3>&1 
goto :EOF 

:Help 
setlocal 
::------------------------------------------------ 
:: Adapt these in pairs according to your likings 
set invokeKeys=[Shift]+[Enter] 
set invokeHotkeys=+Enter 
set invokeAfterRemoveKeys=[Alt]+[Enter] 
set invokeAfterRemoveHotkeys=!Enter 
set removeKeys=[Alt]+[c] 
set removeHotkeys=!c 
::----------------------------------------------- 
set invokeText=invokes the entered command after preceding it with '%0 ' 
set invokeAfterRemoveText=invokes the entered command after removing the first three characters from the beginning 
set removeText=removes the first three characters from the command line 
echo Colors a command's stderr output as defined in %~f0 
echo Usage: 
echo - Preceed a command with '%0 ' (e.g.: 'co dir not.existing.file' will show the resulting error message in a different color) 
echo - If the AutoHotkey script below is active: 
echo  - %invokeKeys% ... %invokeText% 
echo  - %invokeAfterRemoveKeys% ... %invokeAfterRemoveText% 
echo  - %removeKeys% ... %removeText% 
echo(
echo  The latter two are useful when using the command line history and having used %invokeKeys% before. 
echo(
echo  Enabled by AutoHotkey script: 
echo(
echo  #IfWinActive ahk_class ConsoleWindowClass 
echo  ; %invokeText% 
echo  %invokeHotkeys%::Send {Home}%0 {Enter} 
echo  ; %invokeAfterRemoveText% 
echo  %invokeAfterRemoveHotkeys%::SendInput {Home}{Del 3}{Enter} 
echo  ; %removeText% 
echo  %removeHotkeys%::SendInput {Home}{Del 3}{End} 
echo  #IfWinActive 
endlocal 
:EOF 
+0

Skończyło się na tym, że nazwałem hilite skryptu (brak czaru), ponieważ napotkałem także problem z kolorem. Naprawdę lubię ten skrypt. :) – gnash117