在 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
将我最初的想法改进为快速防弹版本
最近我在批处理文件中发现了 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
将我最初的想法改进为快速防弹版本