我在批处理文件中找到了文字输出的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
毕竟删除了临时文件。