我正在写一个Windows命令提示符程序。我最初是在Windows 7上工作的,但后来升级到Windows 10,它就坏了。
批处理文件是这样开始的:
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代码。这在Windows 7或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.
问题是echo不支持管道,所以我不能在修改后将其管道化为echo(因为它对几乎所有目的都是多余的)。我不想将其重定向到与Type一起使用的文件,尽管我猜一个管道类型命令替代方案可以做到这一点,但我搜索了一下,没有找到一个。
应该保持灵活,以便使用sed等…我可以通过关键字、字段号等在文本行的任何地方插入高亮。我仍然可以这样做,例如:
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变量到设置的位置将非常感谢。
这里有一个可能的解决方案。而不是使用ansicon
和sed
,借用PowerShell。作为奖励,您可以消除对第三方实用程序的依赖,以实现可以在内部处理的功能。这里有一个涉及powershell
命令宏的例子,它解析管道输入的每一行,在应该被保留的单词处分割字符串,等等。用。bat扩展名保存并尝试一下。
@echo off
setlocal
set "doHighlight=powershell -noprofile -noninteractive "^
$s="%%bold%%";^
foreach ($i in $input) {^
$m=0;^
$h = $i ^| select-string $s -allmatches;^
$i -split $s ^| %%{^
if ($m++) {^
write-host -nonewline $h.matches[$m-2] -f darkblue -b yellow;^
}^
write-host -nonewline $_^
};^
''^
}""
set "bold=some highlighted text"
echo This is some highlighted text with another HighLiGhT here. | call %doHighlight%
set "bold=highlight"
type "%~f0" | call %doHighlight%