Batch file 如何处理Windows 10命令提示剥离ANSI颜色的修改输出?(安西肯)

Batch file 如何处理Windows 10命令提示剥离ANSI颜色的修改输出?(安西肯),batch-file,command-prompt,windows-10,ansi,ansicon,Batch File,Command Prompt,Windows 10,Ansi,Ansicon,我正在为Windows命令提示符编写一个程序。我最初是在Windows7中开发的,但后来升级到Windows10,在那里它已经坏了 批处理文件以以下内容开头: rem _bc == Background Color (NOT ANSI) rem _bc2 == ANSI BGCOLOR rem _hc == Highlight Color rem _hc2 == NOT Highlighted Color set _hc=[1;36; set _hc2=[1;37; set _bc=[0

我正在为Windows命令提示符编写一个程序。我最初是在Windows7中开发的,但后来升级到Windows10,在那里它已经坏了

批处理文件以以下内容开头:

rem _bc  == Background Color (NOT ANSI)
rem _bc2 == ANSI BGCOLOR
rem _hc  == Highlight Color
rem _hc2  == NOT Highlighted Color

set _hc=[1;36;
set _hc2=[1;37;
set _bc=[0m
set _bc2=46m
set color2=f

ansicon cmd /K
在我的程序中,我想获取一行输出,然后在行的开头和结尾附加一个变量(不是严格意义上的,只是作为一个示例),该变量具有ANSI代码来为文本着色。我一直用sed来做这个。使用sed比将变量硬编码到每个输出中更灵活

echo  Keep your eye out for %_hc%%_bc2%Highlighted%_bc%%_hc2%%_bc2% information!
这与类似的情况相比:

echo THIS IS THE TEST OUTPUT:|sed "s/^/%_hc%%_bc2%/"|sed "s/$/%_bc%/"

rem ================[Result]=======================
rem Displays "THIS IS THE TEST OUTPUT" in color
rem This is broken in Windows 10's Command Prompt.
似乎使用sed、sort或基本上除了echo或type命令以外的任何命令,它会去除颜色输出,而只输出ANSI代码。这在Windows7或XP中从未发生过。例如:

echo %_hc%%_bc2%THIS IS THE TEST OUTPUT:%_bc%|sort

rem ================[Result]=======================
rem Displays "←[1;36;46mTHIS IS THE TEST OUTPUT←[0m"
rem This works if you don't pipe it to sort.
rem Outputting to a file and then using type also works.
Keep your eye out for Highlighted information!

rem ================[Result]=======================
rem Displays "Keep your eye out for Highlighted information!"
rem Where "Highlighted" is the only word in color.
问题是echo不支持管道,所以我不能在修改后将其管道化到echo(因为它在几乎所有用途中都是多余的)。我不想将它重定向到一个与Type一起使用的文件,虽然我想一个pipeable-Type命令替代方案可以做到这一点,但我四处搜索,没有找到一个

它应该保持灵活性,以便使用sed等。。。我可以通过关键字、字段号等在文本行的任何位置插入突出显示。我仍然可以完成这项工作,例如:

echo %_hc%%_bc2%THIS IS THE TEST OUTPUT:%_bc%|sort

rem ================[Result]=======================
rem Displays "←[1;36;46mTHIS IS THE TEST OUTPUT←[0m"
rem This works if you don't pipe it to sort.
rem Outputting to a file and then using type also works.
Keep your eye out for Highlighted information!

rem ================[Result]=======================
rem Displays "Keep your eye out for Highlighted information!"
rem Where "Highlighted" is the only word in color.

如果您能在不将ansi变量硬编码到设定位置的情况下,通过管道传输到文件或将ansi变量硬编码到设定位置来解决此问题,我们将不胜感激。

这里有一个可能的解决方案。不要使用
ansicon
sed
,而是从PowerShell借用。作为奖励,您可以消除对第三方实用程序的依赖,以获得可在内部处理的功能。下面是一个涉及
powershell
命令宏的示例,该宏解析每一行管道输入,在应粗体字处拆分字符串,等等。请使用.bat扩展名保存此宏,然后再试一次

@echo关闭
setlocal
设置“doHighlight=powershell-noprofile-noninteractive”^
$s=\“%%粗体%\”^
foreach($i单位为$input){^
$m=0^
$h=$i^|选择字符串$s-allmatches^
$i-拆分$s^ |%%{^
如果($m++){^
写入主机-nonewline$h.matches[$m-2]-f暗蓝色-b黄色^
}^
写主机-非WLINE$_^
};^
''^
}""
设置“粗体=一些突出显示的文本”
这是一些突出显示的文本,这里有另一个突出显示呼叫%doHighlight%
设置“粗体=突出显示”
键入“%~f0”|调用%doHighlight%

如果在配管之前添加
2>&1
会怎么样?我已经研究过如何使用处理程序,但我不知道如何使其工作。