更改stderr的窗口上的文本输出颜色

我最近发现了一个解决scheme,让stderr为Linux输出一个不同的颜色(bash)

他们创build了下面的bash脚本脚本

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

这会导致输出从stderr打印黄色文本。 标准输出仍然打印相同的颜色。

该脚本被保存在$ PATH的一个名为color的目录中。 这允许我使用make或scons来运行脚本,并且它会将来自stderr的所有文本用黄色高亮。 (可以通过改变33m到31m使文本变红)

 color make CPU=x64 

这对编译时发现错误非常有用。

有没有类似的脚本可以用于Windows cmd shell?

注意:如果有帮助,我已经安装在我的Windows电脑上。

至于Windows下的cmd.exe支持ANSI转义码,请参阅ansicon 。 在将您的重定向逻辑转换为cmd.exe语法之后,我准备了以下color.bat文件:

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

不幸的是,这些流是混合的(在一些行中,来自标准输出和标准错误的字符在单行中混合在一起)。 也许这个行为取决于使用的sed.exe的版本,所以试试看。

如果这不起作用,请考虑使用最低的cygwin安装。 我测试了你的color.sh脚本,并且能够启动一个.bat文件,并且它在不混合流的情况下正常工作。 我使用的语法是:

 ./color.sh cmd /c test.bat 

我设计了一个使用纯批量命令获得等效解决方案的方法,即不使用Ansi,不使用sed.exe等,只使用findstr:

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

在这种情况下,不同的颜色不是从stderr的整个线条,而是由findstr提供的行号,但是,应该足够满足所述的要求。 我将很快写出一个小的辅助.exe程序,以另一种颜色显示整个stderr行。

@MBu,@ gnash117

由于COLOR是一个Windows命令,我将其重命名为co ,因此我将其扩展为:

 :: 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 ' (eg: '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