我发现这段代码有助于改变批处理文件中文本输出的颜色.有人可以解释它是如何工作的吗?
特别是DEL变量拼图的使用是什么,没有那些第一行,着色根本不起作用,但是DEL当我回声它时变量似乎是空的.
@echo on
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 :ColorText 0b "red"
echo(
call :ColorText 19 "yellow"
goto :eof
:ColorText
echo off
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
goto :eof
Run Code Online (Sandbox Code Playgroud)
还请详细说明for循环和ColorText方法
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
set "DEL=%%a"
)
Run Code Online (Sandbox Code Playgroud)
在这个块之后,DEL变量包含一个<backspace><space><backspace>字符串,由FOR循环创建prompt $H.
这是有效的,因为for循环的命令块是
prompt #$H#$E#
echo on
for %%b in (1) do rem
Run Code Online (Sandbox Code Playgroud)
这首先设置提示#<BACKSPACE><SPACE><BACKSPACE>#<ESCAPE>#(这里的转义是无意义的,我只是从我的字符串库中复制它).
但通常提示不会显示,所以我启用ECHO ON,然后你需要一些提示会出现,并将完成提示for %%b in (1) do rem.
DEL字符稍后将用作文件内容.
:ColorText
<nul set /p ".=%DEL%" > "%~2"
findstr /v /a:%1 /R "^$" "%~2" nul
del "%~2" > nul 2>&1
Run Code Online (Sandbox Code Playgroud)
此函数的第一行创建一个包含DEL变量内容的文件.
文件名的名称与您想要着色的字符串相同.
这对findstr命令很重要.
该findstr /v /a:%1 /R "^$" "%~2" nul会找到任何线/R "^$".
由于列出了两个文件(nul是第二个文件名),每个文件名将被输出并按值的颜色着色/a:%1.由于文件NUL没有内容,因此根本不会输出.
第一个文件名也将输出冒号后跟文件内容.
示例,假设文件内容为ABC,文件名为Hello
findstr的输出将是
Hello:ABC
Run Code Online (Sandbox Code Playgroud)
但是当我<backspace><space><backspace>放入文件内容时,冒号将被删除.
该del "%~2" > nul 2>&1毕竟删除临时文件.