Jak działa kod w Batchu zmieniający kolor dla pojedyńczej linii tekstu z SO?

1

Niedawno znalazłem na StackOverflow taki kod w Batchu, służący do wyświetlania kolorowego tekstu bez globalnej zmiany koloru całej konsoli:

@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 :colorEcho 0B "Hello!"
Echo.
Exit /B

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

Problemem nie jest jednak to, że kod nie działa, bo działa, ale nie rozumiem co tu się dokładnie dzieje, a nie lubię dołączać do swoich programów kodu, którego nie rozumiem. Czy ktoś mógłby mi to wyjaśnić?

0

Chciałbym Ci pomóc ale sam kiedyś straciłem sporo dni na wynalezieniu trybu graficznego w cmd.

Możesz uruchomić ten kod z opcja /v wtedy nie musisz mieć tej linijki SETLOCAL EnableDelayedExpansion

1

Ten kod jest mocno pokręcony. Wykorzystuje możliwość kolorowego wyjścia polecenia findstr z atrybutem /A.
W zamian proponuję coś innego:

@echo off
setlocal
for /f %%a in ('"prompt $E & for %%b in (rem) do %%b"') do set ESC=%%a
echo %ESC%[47;94m Ala ma kota %ESC%[0m
endlocal
0

Bo jest też inna implementacja tego problemu, którą rozumiem, ale wstawia niepotrzebny dwukropek. Tamta poprzednia ma go chyba jakoś usuwać tylko jak to się dzieje?

@echo off
md temp
cd temp
echo. >"Colored text"
findstr /a:0B /c:" " /s "Colored text"
cd ..
rd /s /q temp
0

Może ten przykład trochę pomoże:

@echo off
setlocal
for /f "tokens=1,2" %%a in ('"prompt $E $H & for %%b in (.) do rem"') do (
set ESC=%%a
set DEL=%%b
)
< nul > "Colored text" set /p ="%DEL% or not "
findstr /a:0B /c:" " "Colored text" nul
del /q "Colored text"
< nul > "and again" set /p ="%DEL%!"
findstr /a:0E /c:"!" "and again" nul
del /q "and again"
endlocal

albo ten:

@echo off
setlocal
call :cput 0B "Colored text"
call :cput 07 " or not"
call :cput 0E " and again"
echo !
endlocal
exit /b
:cput
if "%DEL%"=="" for /f %%a in ('echo prompt $H ^| cmd') do set DEL=%%a
set /p ="%DEL% %DEL%" < nul > %2
findstr /a:%1 /c:"%DEL%" %2 nul
del /q %2

1 użytkowników online, w tym zalogowanych: 0, gości: 1