1

我正在为 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 变量硬编码到设定位置的情况下解决此问题的任何帮助将不胜感激。

4

1 回答 1

3

这是一种可能的解决方案。不使用ansiconand sed,而是从 PowerShell 借用。作为奖励,您消除了对可以在内部处理的功能的 3rd 方实用程序的依赖。这是一个涉及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%
于 2015-08-11T12:49:20.573 回答