1 (изменено: wisgest, 2013-10-28 19:18:51)

Тема: 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, используемые для удаления завершающего двоеточия с точкой, можете воспользоваться присоединённым файлом).

Post's attachments

color.zip 682 b, 28 downloads since 2013-10-23 

You don't have the permssions to download the attachments of this post.