在 winXP 上以彩色回显结尾的奇怪字符串(findstr)

Weird string ending in colored echo on winXP(findstr)

最近我在批处理文件中发现了 coloring echo,一切看起来都很好,直到我在 Windows XP 上尝试它。这个错误(?)在更高版本上不可重现(至少在 w7、w8 上)

当用 call :cecho <colors> "<string>" 调用时,究竟是什么导致 . . 出现在字符串之后?如何摆脱它并仍然让它在 winXP 和更高版本上工作?

@echo off
setlocal ENABLEDELAYEDEXPANSION
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)

call :cecho 03 "I am colorful, yay" & echo.
pause
exit

:cecho
@echo off
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1

输出:

I am colorful, yay:. .
Press any key to continue . . .

编辑: PS: 我对外部程序、vbs 或powershell 不感兴趣。请使用纯批处理解决方案。

编辑2:

感谢@sokin,我找到了一个解决方案,但是@jeb 的解决方案每次都会创建一个文件,但不会删除它。因此简单 del 修复它。

@echo off
setlocal EnableDelayedExpansion
for /f "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set "DEL=%%a"
)
<nul > X set /p ".=."

call :color 1a "a"
call :color 1b "b"
call :color 1c "^!<>&| %%%%"*?"
del "%~dp0X"
pause
exit

:color
set "param=^%~2" !
set "param=!param:"=\"!"
findstr /p /A:%1 "." "!param!\..\X" nul
<nul set /p ".=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%"

如前所述,findstr command has some strange behaviour.
在 XP 上,它用点替换退格字符。

但是当创建的临时文件包含点而不是退格时,问题就可以解决。
因此我构建了第二个解决方案,但正如 dbenham 提到的,我的原始代码仍然无法处理某些字符。

Carlos 在 Dostips: Color function v19

将我最初的想法改进为快速防弹版本