Change text output color on windows for stderr
我最近发现了一篇文章,给出了一个解决方案,让stderr为Linux(bash)提供不同颜色的文本输出。
他们创建了下面的bash脚本
1 2 | #!/bin/bash { $* 2>&1>&3|sed 's,.*,\x1B[33m&\x1B[0m,'>&2;} 3>&1 |
这会导致输出在来自stderr时打印黄色文本。stdout仍然打印相同的颜色。
脚本保存在$path的一个名为color的目录中。这允许我使用make或scons运行脚本,它将以黄色显示stderr中的所有文本。(可通过将33m改为31m使文本变红)
1 | color make CPU=x64 |
号
这对于在编译时查找错误非常有用。
是否有类似的脚本可用于Windows命令行解释器?
注意:如果有帮助,我已经在我的Windows计算机上安装了SED。
关于支持windows的cmd.exe下的ansi转义码,请参见ansicon。在将重定向逻辑转换为cmd.exe语法后,我准备了以下
1 2 | @Echo Off (((%* 1>&3) 2>&1) |"c:\Program Files (x86)\GnuWin32\bin\sed.exe""s,.*,\x1B[33m&\x1B[0m," 1>&2) 3>&1 |
不幸的是,流是混合的(在某些行上,来自stdout和stderr的字符在单行中混合在一起)。也许这种行为取决于所使用的sed.exe的版本,所以请尝试一下。
如果这不起作用,考虑使用最小cygwin安装。我测试了你的
1 | ./color.sh cmd /c test.bat |
号
我设计了一种使用纯批处理命令获得等效解决方案的方法,即不使用ansi、不使用sed.exe等,只使用findstr:
1 | any_command 2>&1 1>&3 | findstr /N /A:4E"^" |
在这种情况下,从stderr到findstr的整行不使用不同的颜色,而只使用findstr提供的行数,但该行数应足以满足规定的要求。我将很快编写一个小的auxiliary.exe程序,它将以另一种颜色显示整个stderr行。
@MBU,@gnash117
我将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | :: 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 |
。