我在批处理文件中找到了文字输出的this piece of code which helps to change colors。有人可以解释一下它是如何工作的吗?

尤其是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

还请阐明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"
)

在此块之后,DEL变量包含一个<backspace><space><backspace>字符串,该字符串由prompt $H在FOR循环中创建。
这是可行的,因为for循环的命令块是
prompt #$H#$E#
echo on
for %%b in (1) do rem

这首先将提示设置为#<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

此函数的第一行创建一个文件,其中包含DEL变量的内容。
文件名的名称类似于您要着色的字符串。
这对于findstr命令很重要。
findstr /v /a:%1 /R "^$" "%~2" nul可以在/R "^$"的任何行中找到。
由于列出了两个文件(nul是第二个文件名),每个文件名将被输出并由/a:%1的值着色。
由于文件NUL没有内容,因此将完全不输出。
并且第一个文件名也将以冒号输出,后跟文件内容。

示例,假设文件内容为ABC,文件名为Hello
findstr的输出将是
Hello:ABC

但是,当我将<backspace><space><backspace>放入文件内容时,冒号将被删除。
del "%~2" > nul 2>&1毕竟删除了临时文件。

10-08 11:43