Тема: CMD/BAT: Вывод разноцветного текста
Автор представленного решения (обсуждение) — Arigato.
Утилита FINDSTR при помощи ключа /A позволяет задать цвета текста и фона для выводимых имён файлов, в которых обнаружено соответсвие строке поиска (после имени файла теми же цветами выводится двоеточие, а затем, уже общими цветами окна консоли, строка, содержащая соответствие). Причём, если строка, содержащая соответствие, в файле последняя и не завершается переводом строки, то перевод строки после неё будет отсутствовать и в выводе FINDSTR.
Это используется в двух сдедующих процедурах, предназначенных для вывода текста заданного цвета:
:write
:: Вывести цветную надпись без перевода строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
:writeLn
:: Вывести цветную надпись с переводом строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
Пример использования:
call :writeLn 2C " Hello, World "
— выведет «Hello, World» красным цветом на зеленом фоне.
Особенности:
1. Цвет задается аналогично команде COLOR, т.е. цвет фона и текста двумя шестнадцатеричными цифрами.
2. Учитывая то, что цветным выводится имя файла, далеко не любой текст можно вывести этим методом. Текст должен быть допустимым с точки зрения составления имени файла.
3. В каталоге %TEMP% создается и затем удаляется временный подкаталог (если при создании подкаталога происходит ошибка, попытка повторяется для другого имени…).
4. В конце строки можно вывести двоеточие, хотя оно не может присутствовать в имени файла. Для этого надо установить любое значение в качестве третьего аргумента процедуры.
5. Пробелы в конце строки съедаются, в начале строки сохраняются.
6. В строках длинной 78 и 79 символов, т.е. если строка подходит к концу экрана, при выводе в конце могут добавиться двоеточие и точка (используемая здесь в качестве строки поиска FINDSTR). (wisgest: Точнее, в строках длиной n*w-1 и n*w-2, где n — целое число, w — ширина буфера экрана в символах, которая может отличаться от 80.)
Пример с двоеточием:
call :write 0F "Random" 1
call :writeLn 0E " %random%"
В таком примере в конце строки будет выведено двоеточие зеленого цвета и точка обычного цвета (wisgest: если ширина буфера экрана составляет 80 символов):
call :writeLn 0A "123456789012345678901234567890123456789012345678901234567890123456789012345678"
Сами процедуры с использующим их примером:
@ echo off
setlocal enabledelayedexpansion
call :write 0F "Random" 1
call :writeLn 0E " %random%"
echo:
set hex=0123456789ABCDEF
for /l %%j in (1, 1, 6) do (
for /l %%i in (15, -1, 1) do (
call :write !hex:~%%i,1!!hex:~%%j,1! "[---]"
)
echo:
)
echo:
call :writeLn 2C " Hello, World "
echo:
call :writeLn 0A "123456789012345678901234567890123456789012345678901234567890123456789012345678"
echo:
pause
color 0B
pause
endlocal
exit /b 0
:write
:: Вывести цветную надпись без перевода строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
setlocal
:write1
set "tempFolder=%TEMP%\%~n0.%time:~-2%.%random%"
md "%tempFolder%" 2>nul || goto write1
pushd %tempFolder%
set /p .=.<nul>"%~2"
findstr /a:%~1 /c:"." /s "%~2"
if "%~3"=="" (set /p .= <nul) else set /p .= <nul
popd
rd /s /q "%tempFolder%" 2>nul
endlocal & exit /b
:writeLn
:: Вывести цветную надпись с переводом строки
:: %1 - цвет
:: %2 - текст надписи
:: %3 - флаг, любое значение, если нужно двоеточие в конце строки
call :write %1 "%~2" %3
echo:
exit /b
(т.к. имеются управляющие символы Backspace, используемые для удаления завершающего двоеточия с точкой, можете воспользоваться присоединённым файлом).