как иметь несколько цветов в командном файле windows?

<p>мне было интересно, возможно ли иметь разноцветный текст в одной строке в командном файле windows, например, если он говорит</p><pre><code>echo hi world </code></pre><p>я хочу, чтобы "привет" был одним цветом, а "мир" - другим цветом. может быть, я мог бы установить команду color в качестве переменной:</p><pre><code>set color1= color 2 set color9= color a </code></pre><p>а затем разверните их оба на одной линии вместе с </p><pre><code>echo hi world </code></pre><p>но я не знаю, как бы я это сделал.</p>

<p>на самом деле это можно сделать без создания временного файла . метод, описанный jeb и dbenham, будет работать даже с целевым файлом, который не содержит обратных символов. критическим моментом является то, что строка, распознаваемая findstr.exe, не должна заканчиваться crlf . таким образом, очевидным текстовым файлом для сканирования строкой, не заканчивающейся crlf, является сам вызывающий пакет, при условии, что мы заканчиваем его таким строка! вот обновленный пример сценария, работающий таким образом ...</p><p>отличия от предыдущего примера:</p><ul> <li>использует одну черту в последней строке в качестве строки для поиска. (должно быть коротким и не появляться где-либо еще, как это в партии.)</li> <li>переименованы подпрограммы и переменные, чтобы быть немного более объектно-ориентированными :-)</li> <li>удален один уровень вызова, чтобы немного улучшить производительность.</li> <li>добавлены комментарии (начиная с: #, чтобы больше походить на большинство других языков сценариев.)</li> </ul><hr><pre><code>@echo off setlocal call :echo.color.init goto main :echo.color %1=color %2=str [%3=/n] setlocal enabledelayedexpansion set "str=%~2" :echo.color.2 :# replace path separators in the string, so that the final path still refers to the current path. set "str=a%echo.del%!str:\=a%echo.del%\..\%echo.del%%echo.del%%echo.del%!" set "str=!str:/=a%echo.del%/..\%echo.del%%echo.del%%echo.del%!" set "str=!str:"=\"!" :# go to the script directory and search for the trailing - pushd "%echo.dir%" findstr /p /r /a:%~1 "^^-" "!str!\..\!echo.file!" nul popd :# remove the name of this script from the output. (dependant on its length.) for /l %%n in (1,1,12) do if not "!echo.file:~%%n!"=="" <nul set /p "=%echo.del%" :# remove the other unwanted characters "\..\: -" <nul set /p "=%echo.del%%echo.del%%echo.del%%echo.del%%echo.del%%echo.del%%echo.del%" :# append the optional crlf if not "%~3"=="" echo. endlocal & goto :eof :echo.color.var %1=color %2=strvar [%3=/n] if not defined %~2 goto :eof setlocal enabledelayedexpansion set "str=!%~2!" goto :echo.color.2 :echo.color.init set "echo.color=call :echo.color" set "echo.dir=%~dp0" set "echo.file=%~nx0" set "echo.full=%echo.dir%%echo.file%" :# use prompt to store a backspace into a variable. (actually backspace+space+backspace) for /f "tokens=1 delims=#" %%a in ('"prompt #$h# & echo on & for %%b in (1) do rem"') do set "echo.del=%%a" goto :eof :main call :echo.color 0a "a" call :echo.color 0b "b" set "txt=^" & call :echo.color.var 0c txt call :echo.color 0d "<" call :echo.color 0e ">" call :echo.color 0f "&" call :echo.color 1a "|" call :echo.color 1b " " call :echo.color 1c "%%%%" call :echo.color 1d ^""" call :echo.color 1e "" call :echo.color 1f "?" :# call :echo.color 2a "!" call :echo.color 2b "." call :echo.color 2c ".." call :echo.color 2d "/" call :echo.color 2e "" call :echo.color 2f "q:" /n echo( set complex="c:hello world!/...a//^<%%>&|!" /^^^<%%^>^&^|! call :echo.color.var 74 complex /n exit /b :# the following line must be last and not end by a crlf. - ps. у меня проблема с выводом! персонаж, которого у вас не было в предыдущем примере. (или, по крайней мере, у вас не было таких же симптомов.) для исследования.

вы можете делать многоцветные выходы без каких-либо внешних программ.@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" ) echo say the name of the colors, don't read call :colortext 0a "blue" call :colortext 0c "green" call :colortext 0b "red" echo( call :colortext 19 "yellow" call :colortext 2f "black" call :colortext 4e "white" goto :eof :colortext echo off <nul set /p ".=%del%" > "%~2" findstr /v /a:%1 /r "^$" "%~2" nul del "%~2" > nul 2>&1 goto :eof </code></pre><p>он использует функцию цвета команды findstr. </p><p>findstr может быть настроен для вывода номеров строк или имен файлов в определенном цвете.<br> итак, сначала я создаю файл с текстом в качестве имени файла, а содержимое представляет собой один символ <code><backspace></code> (ascii 8).<br> затем я ищу все непустые строки в файле и в nul, поэтому имя файла будет выведено в правильном цвете с добавлением двоеточия, но двоеточие немедленно удаляется <code><backspace></code>.</p><p><strong> правка: год спустя ... все символы действительны </strong></p><pre><code>@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" ) rem prepare a file "x" with only one dot <nul > x set /p ".=." call :color 1a "a" call :color 1b "b" call :color 1c "^!<>&| %%%%"*?" exit /b :color set "param=^%~2" ! set "param=!param:"=\"!" findstr /p /a:%1 "." "!param!\..\x" nul <nul set /p ".=%del%%del%%del%%del%%del%%del%%del%" exit /b </code></pre><p>это использует правило для правильного пути/имени файла.<br> если в пути указан <code>\..\</code>, префиксный элемент будет удален полностью, и нет необходимости, чтобы этот элемент содержал только допустимые символы имени файла.</p>

<p>отредактированный ответ джеба приближается к решению всех вопросов. но у него есть проблемы со следующими строками:</p><pre><code>"a\b\" "a/b/" "\" "/" "." ".." "c:" </code></pre><p>я изменил его технику так, чтобы, на мой взгляд, он мог обрабатывать любую строку печатных символов, кроме ограничений по длине.</p><p>другие улучшения:</p><ul> <li><p>использует расположение% temp% для временного файла, поэтому больше не требуется доступ на запись в текущий каталог.</p></li> <li><p>создано 2 варианта, один принимает строковый литерал, другой - имя переменной, содержащей строку. версия переменной, как правило, менее удобна, но она устраняет некоторые проблемы с выходом специальных символов.</p></li> <li><p>добавлена опция/n в качестве необязательного 3-го параметра для добавления новой строки в конце вывода.</p></li> </ul><p>backspace не работает через разрыв строки, поэтому у техники могут быть проблемы, если строка переносится. например, печать строки длиной от 74 до 79 не будет работать должным образом, если консоль имеет ширину линии 80.</p><pre><code>@echo off setlocal call :initcolorprint call :colorprint 0a "a" call :colorprint 0b "b" set "txt=^" & call :colorprintvar 0c txt call :colorprint 0d "<" call :colorprint 0e ">" call :colorprint 0f "&" call :colorprint 1a "|" call :colorprint 1b " " call :colorprint 1c "%%%%" call :colorprint 1d ^""" call :colorprint 1e "*" call :colorprint 1f "?" call :colorprint 2a "!" call :colorprint 2b "." call :colorprint 2c ".." call :colorprint 2d "/" call :colorprint 2e "\" call :colorprint 2f "q:" /n echo( set complex="c:\hello world!/.\..\\a//^<%%>&|!" /^^^<%%^>^&^|!\ call :colorprintvar 74 complex /n call :cleanupcolorprint exit /b ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :colorprint color str [/n] setlocal set "str=%~2" call :colorprintvar %1 str %3 exit /b :colorprintvar color strvar [/n] if not defined %~2 exit /b setlocal enabledelayedexpansion set "str=a%del%!%~2:\=a%del%\..\%del%%del%%del%!" set "str=!str:/=a%del%/..\%del%%del%%del%!" set "str=!str:"=\"!" pushd "%temp%" findstr /p /a:%1 "." "!str!\..\x" nul if /i "%~3"=="/n" echo( exit /b :initcolorprint for /f "tokens=1,2 delims=#" %%a in ('"prompt #$h#$e# & echo on & for %%b in (1) do rem"') do set "del=%%a" <nul >"%temp%\x" set /p "=%del%%del%%del%%del%%del%%del%.%del%" exit /b :cleanupcolorprint del "%temp%\x" exit /b </code></pre><p><br/><strong><em>обновление 2012-11-27</em></strong></p><p><em>этот метод не срабатывает на xp, потому что findstr отображает на экране символ возврата в виде точки. оригинальный ответ jeb работает на xp, хотя и с уже отмеченными ограничениями</em></p><p><br/><strong><em>обновление 2012-12-14</em></strong></p><p>в <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=4014">dostips</a> и <a href="http://ss64.org/viewtopic.php?pid=6334">ss64</a> было много разработок. оказывается, что findstr также портит имена файлов, содержащие расширенные ascii, если они указаны в командной строке. я обновил мой <a href="https://stackoverflow.com/q/8844868/1012053">findstr q & a</a> .</p><p>ниже приведена версия, которая работает на xp и поддерживает все однобайтовые символы, кроме 0x00 (nul), 0x0a (перевод строки) и 0x0d (возврат каретки). однако при работе в xp большинство управляющих символов отображаются в виде точек. это неотъемлемая особенность findstr в xp, которую нельзя избежать.</p><p>к сожалению, добавление поддержки для xp и для расширенных ascii символов замедляет процедуру :-(</p><p>просто для забавы я взял несколько цветных ascii рисунков из <a href="http://www.oocities.org/spunk1111/">художественной галереи джоан старка ascii</a> и адаптировал их для использования с colorprint. я добавил точку входа: c только для краткости и для решения проблемы с литералами кавычек.</p><pre><code>@echo off setlocal disabledelayedexpansion set q=^" echo( echo( call :c 0e " , .-;" /n call :c 0e " , |\ / / \_\_," /n call :c 0e " |\ '.`-.| |.'.-'" /n call :c 0e " \`'-: `; : /" /n call :c 0e " `-.\_'. \'|" /n call :c 0e " ,\_.-=` ` ` ~,\_" /n call :c 0e " '--,. "&call :c 0c ".-. "&call :c 0e ",=!q!." /n call :c 0e " / "&call :c 0c "{ "&call :c 0a "* "&call :c 0c ")"&call :c 0e "`"&call :c 06 ";-."&call :c 0e "}" /n call :c 0e " | "&call :c 0c "'-' "&call :c 06 "/\_\_ |" /n call :c 0e " / "&call :c 06 "\\_,\|" /n call :c 0e " | (" /n call :c 0e " "&call :c 0c "\_\_ "&call :c 0e "/ ' \" /n call :c 02 " /\\_ "&call :c 0c "/,'`"&call :c 0e "| ' "&call :c 0c ".-~!q!~~-." /n call :c 02 " |`.\\_ "&call :c 0c "| "&call :c 0e "/ ' , "&call :c 0c "/ \" /n call :c 02 " \_/ `, \"&call :c 0c "| "&call :c 0e "; , . "&call :c 0c "| , ' . |" /n call :c 02 " \ `, "&call :c 0c "| "&call :c 0e "| , , "&call :c 0c "| : ; : |" /n call :c 02 " \_\ `, "&call :c 0c "\ "&call :c 0e "|. , "&call :c 0c "| | | | |" /n call :c 02 " \` `. "&call :c 0c "\ "&call :c 0e "| ' "&call :c 0a "|"&call :c 0c "\\_|-'|\_,'\|" /n call :c 02 " \_\ `, "&call :c 0a "`"&call :c 0e "\ ' . ' "&call :c 0a "| | | | | "&call :c 02 "\_\_" /n call :c 02 " \ `, "&call :c 0e "| , ' "&call :c 0a "|\_/'-|\_\\_/ "&call :c 02 "\_\_ ,-;` /" /n call :c 02 " \ `, "&call :c 0e "\ . , ' .| | | | | "&call :c 02 "\_/' ` \_=`|" /n call :c 02 " `\ `, "&call :c 0e "\ , | | | | |"&call :c 02 "\_/' .=!q! /" /n call :c 02 " \` `, "&call :c 0e "`\ \/|,| ;"&call :c 02 "/' .=!q! |" /n call :c 02 " \ `, "&call :c 0e "`\' , | ; "&call :c 02 "/' =!q! \_/" /n call :c 02 " `\ `, "&call :c 05 ".-!q!!q!-. "&call :c 0e "': "&call :c 02 "/' =!q! /" /n call :c 02 " jgs \_`\ ;"&call :c 05 "\_{ ' ; "&call :c 02 "/' =!q! /" /n call :c 02 " \_\`-/\_\_"&call :c 05 ".~ `."&call :c 07 "8"&call :c 05 ".'.!q!`~-. "&call :c 02 "=!q! \_,/" /n call :c 02 " \_\_\ "&call :c 05 "{ '-."&call :c 07 "|"&call :c 05 ".'.--~'`}"&call :c 02 " \_/" /n call :c 02 " \ .=!q!` "&call :c 05 "}.-~!q!'"&call :c 0d "u"&call :c 05 "'-. '-..' "&call :c 02 "\_\_/" /n call :c 02 " \_/ .!q! "&call :c 05 "{ -'.~('-.\_,.'"&call :c 02 "\\_,/" /n call :c 02 " / .!q! \_/'"&call :c 05 "`--; ; `. ;" /n call :c 02 " .=!q! \_/' "&call :c 05 "`-..\_\_,-'" /n call :c 02 " \_\_/'" /n echo( exit /b :c setlocal enabledelayedexpansion ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :colorprint color str [/n] setlocal set "s=%~2" call :colorprintvar %1 s %3 exit /b :colorprintvar color strvar [/n] if not defined del call :initcolorprint setlocal enabledelayedexpansion pushd . ': cd \ set "s=!%~2!" :: the single blank line within the following in() clause is critical - do not remove for %%n in (^"^ ^") do ( set "s=!s:\=%%~n\%%~n!" set "s=!s:/=%%~n/%%~n!" set "s=!s::=%%~n:%%~n!" ) for /f delims^=^ eol^= %%s in ("!s!") do ( if "!" equ "" setlocal disabledelayedexpansion if %%s==\ ( findstr /a:%~1 "." "\'" nul <nul set /p "=%del%%del%%del%" ) else if %%s==/ ( findstr /a:%~1 "." "/.\'" nul <nul set /p "=%del%%del%%del%%del%%del%" ) else ( >colorprint.txt (echo %%s\..\') findstr /a:%~1 /f:colorprint.txt "." <nul set /p "=%del%%del%%del%%del%%del%%del%%del%" ) ) if /i "%~3"=="/n" echo( popd exit /b :initcolorprint for /f %%a in ('"prompt $h&for %%b in (1) do rem"') do set "del=%%a %%a" <nul >"%temp%'" set /p "=." subst ': "%temp%" >nul exit /b :cleanupcolorprint 2>nul del "%temp%'" 2>nul del "%temp%colorprint.txt" >nul subst ': /d exit /b 

если у вас современная windows (с установленным powershell), то может хорошо работать и следующееcall :printbright something something (do actual batch stuff here) call :printbright done! goto :eof :printbright powershell -command write-host "%" -foreground "white" отрегулируйте цвет по своему усмотрению. 

чтобы завершить эту тему, вы также можете отображать текст в цвете, используя мою вспомогательную программу colorshow.exe; вы можете скачать его с <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=3428&p=17750#p17750"><strong>этого сайта</strong> , найти программу # 12. обратите внимание, что первая часть документации появляется в программе # 2-show.exe.на этом сайте есть несколько вспомогательных программ, которые позволяют добиться некоторых интересных вещей. например, программа № 6-cursorpos.exe позволяет перемещать курсор в любое место на экране.это пример вывода, созданного командным файлом с помощью моей вспомогательной программы colorshow.exe:<img src="https://i.stack.imgur.com/x1a09.jpg" alt="mona-lisa">пакетному файлу потребовалось менее 3 секунд, чтобы показать предыдущее изображение с разрешением 322x138 (с использованием шрифта lucida console @ size 5). вы можете просмотреть метод, использованный для создания этого изображения в <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=4125">этот пост .<strong>edit</strong>: я опубликовал гораздо более простой способ получить программу colorshow.exe и краткое описание ее; просто следуйте <a href="https://stackoverflow.com/questions/31405873/how-do-i-get-brown-text-in-a-batch-file/31414317#31414317">эта ссылка .

комбинируя <a href="https://stackoverflow.com/a/10407642/1683264">птица и синтаксис dbenham с <a href="https://stackoverflow.com/a/12894047/1683264">метод скребла write-host скребла , кажется, что powershell может рендерить сложную графику быстрее, чем чистый пакетный метод dbenham (ну, после того, как powershell был один раз заполнен, тем не мение). необходим минимальный массаж струн, хотя я не проверял это ни с чем, кроме птицы. например, если вам нужен ярко-зеленый символ окончания передачи, вам может не повезти. <strong>:)</strong>этот метод требует вывода во временный файл просто потому, что вызов powershell для каждого call :c занимает вечность, и намного быстрее поставить в очередь вывод для одного вызова powershell. но у этого есть преимущество простоты и эффективности.@echo off setlocal disabledelayedexpansion set q=^" echo( echo( call :c 0e " , .-;" /n call :c 0e " , | / / __," /n call :c 0e " | '.-.| |.'.-'" /n call :c 0e " '-: ; : /" /n call :c 0e " -._'. '|" /n call :c 0e " ,_.-=   ~,_" /n call :c 0e " '--,. "&call :c 0c ".-. "&call :c 0e ",=!q!." /n call :c 0e " / "&call :c 0c "{ "&call :c 0a " "&call :c 0c ")"&call :c 0e ""&call :c 06 ";-."&call :c 0e "}" /n call :c 0e " | "&call :c 0c "'-' "&call :c 06 "/__ |" /n call :c 0e " / "&call :c 06 "_,|" /n call :c 0e " | (" /n call :c 0e " "&call :c 0c "__ "&call :c 0e "/ ' " /n call :c 02 " /_ "&call :c 0c "/,'"&call :c 0e "| ' "&call :c 0c ".-~!q!~~-." /n call :c 02 " |._ "&call :c 0c "| "&call :c 0e "/ ' , "&call :c 0c "/ " /n call :c 02 " _/ , "&call :c 0c "| "&call :c 0e "; , . "&call :c 0c "| , ' . |" /n call :c 02 "  , "&call :c 0c "| "&call :c 0e "| , , "&call :c 0c "| : ; : |" /n call :c 02 " _ , "&call :c 0c " "&call :c 0e "|. , "&call :c 0c "| | | | |" /n call :c 02 "  . "&call :c 0c " "&call :c 0e "| ' "&call :c 0a "|"&call :c 0c "_|-'|_,'|" /n call :c 02 " _ , "&call :c 0a ""&call :c 0e " ' . ' "&call :c 0a "| | | | | "&call :c 02 "__" /n call :c 02 "  , "&call :c 0e "| , ' "&call :c 0a "|_/'-|__/ "&call :c 02 "__ ,-; /" /n call :c 02 "  , "&call :c 0e " . , ' .| | | | | "&call :c 02 "_/'  _=|" /n call :c 02 "  , "&call :c 0e " , | | | | |"&call :c 02 "_/' .=!q! /" /n call :c 02 "  , "&call :c 0e " /|,| ;"&call :c 02 "/' .=!q! |" /n call :c 02 "  , "&call :c 0e "' , | ; "&call :c 02 "/' =!q! _/" /n call :c 02 "  , "&call :c 05 ".-!q!!q!-. "&call :c 0e "': "&call :c 02 "/' =!q! /" /n call :c 02 " jgs _ ;"&call :c 05 "_{ ' ; "&call :c 02 "/' =!q! /" /n call :c 02 " _-/__"&call :c 05 ".~ ."&call :c 07 "8"&call :c 05 ".'.!q!~-. "&call :c 02 "=!q! _,/" /n call :c 02 " __ "&call :c 05 "{ '-."&call :c 07 "|"&call :c 05 ".'.--~'}"&call :c 02 " _/" /n call :c 02 "  .=!q! "&call :c 05 "}.-~!q!'"&call :c 0d "u"&call :c 05 "'-. '-..' "&call :c 02 "__/" /n call :c 02 " _/ .!q! "&call :c 05 "{ -'.~('-._,.'"&call :c 02 "_,/" /n call :c 02 " / .!q! _/'"&call :c 05 "--; ; . ;" /n call :c 02 " .=!q! _/' "&call :c 05 "-..__,-'" /n call :c 02 " __/'" /n if exist "%temp%color.psm1" ( powershell -command "&{set-executionpolicy remotesigned; import-module '%temp%color.psm1'}" del "%temp%color.psm1" ) echo( exit /b ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :c <color pair> <string>  setlocal enabledelayedexpansion set "colors=0-black;1-darkblue;2-darkgreen;3-darkcyan;4-darkred;5-darkmagenta;6-darkyellow;7-gray;8-darkgray;9-blue;a-green;b-cyan;c-red;d-magenta;e-yellow;f-white" set "p=%~1" set "bg=!colors:%p:~0,1%-=!" set bg=%bg:;=&rem.% set "fg=!colors:%p:~-1%-=!" set fg=%fg:;=&rem.% if not "%~3"=="/n" set "br=-nonewline" set "str=%~2" & set "str=!str:'=''!" >>"%temp%color.psm1" echo write-host '!str!' -foregroundcolor '%fg%' -backgroundcolor '%bg%' %br% endlocal результат:<img src="https://i.stack.imgur.com/gdtdn.png" alt="enter image description here">

 <a href="https://github.com/npocmaka/batch.scripts/blob/master/hybrids/.net/coloroutput.bat">без внешних инструментов . это самоскомпилированный <strong>bat/.net hybrid</strong> (должен быть сохранен как .bat), который можно использовать в любой системе, в которой установлен .net framework (это редко можно увидеть windows без .net framework даже для самых старых установок xp/2003). он использует компилятор jscript.net для создания исполняемого файла, способного печатать строки с другим цветом фона/переднего плана только для текущей строки.@if (@x)==(@y) @end / jscript comment @echo off setlocal for /f "tokens= delims=" %%v in ('dir /b /s /a:-d /o:-n "%systemroot%microsoft.netframeworkjsc.exe"') do ( set "jsc=%%v" ) if not exist "%~n0.exe" ( "%jsc%" /nologo /out:"%~n0.exe" "%~dpsfnx0" ) %~n0.exe % endlocal & exit /b %errorlevel% / import system; var arguments:string[] = environment.getcommandlineargs(); var newline = false; var output = ""; var foregroundcolor = console.foregroundcolor; var backgroundcolor = console.backgroundcolor; var evaluate = false; var currentbackground=console.backgroundcolor; var currentforeground=console.foregroundcolor; //http://stackoverflow.com/a/24294348/388389 var jsescapes = { 'n': 'n', 'r': 'r', 't': 't', 'f': 'f', 'v': 'v', 'b': 'b' }; function decodejsescape(_, hex0, hex1, octal, other) { var hex = hex0 || hex1; if (hex) { return string.fromcharcode(parseint(hex, 16)); } if (octal) { return string.fromcharcode(parseint(octal, 8)); } return jsescapes[other] || other; } function decodejsstring(s) { return s.replace( // matches an escape sequence with utf-16 in group 1, single byte hex in group 2, // octal in group 3, and arbitrary other single-character escapes in group 4. /(?:u([0-9a-fa-f]{4})|x([0-9a-fa-f]{2})|([0-3][0-7]{0,2}|[4-7][0-7]?)|(.))/g, decodejsescape); } function printhelp( ) { print( arguments[0] + " -s string [-f foreground] [-b background] [-n] [-e]" ); print( " " ); print( " string string to be printed" ); print( " foreground foreground color - a " ); print( " number between 0 and 15." ); print( " background background color - a " ); print( " number between 0 and 15." ); print( " -n indicates if a new line should" ); print( " be written at the end of the "); print( " string(by default - no)." ); print( " -e evaluates special character " ); print( " sequences like nbr and etc "); print( "" ); print( "colors :" ); for ( var c = 0 ; c < 16 ; c++ ) { console.backgroundcolor = c; console.write( " " ); console.backgroundcolor=currentbackground; console.write( "-"+c ); console.writeline( "" ); } console.backgroundcolor=currentbackground; } function errorchecker( e:error ) { if ( e.message == "input string was not in a correct format." ) { print( "the color parameters should be numbers between 0 and 15" ); environment.exit( 1 ); } else if (e.message == "index was outside the bounds of the array.") { print( "invalid arguments" ); environment.exit( 2 ); } else { print ( "error message: " + e.message ); print ( "error code: " + ( e.number & 0xffff ) ); print ( "error name: " + e.name ); environment.exit( 666 ); } } function numberchecker( i:int32 ){ if( i > 15 || i < 0 ) { print("the color parameters should be numbers between 0 and 15"); environment.exit(1); } } if ( arguments.length == 1 || arguments[1].tolowercase() == "-help" || arguments[1].tolowercase() == "-help" ) { printhelp(); environment.exit(0); } for (var arg = 1; arg <= arguments.length-1; arg++ ) { if ( arguments[arg].tolowercase() == "-n" ) { newline=true; } if ( arguments[arg].tolowercase() == "-e" ) { evaluate=true; } if ( arguments[arg].tolowercase() == "-s" ) { output=arguments[arg+1]; } if ( arguments[arg].tolowercase() == "-b" ) { try { backgroundcolor=int32.parse( arguments[arg+1] ); } catch(e) { errorchecker(e); } } if ( arguments[arg].tolowercase() == "-f" ) { try { foregroundcolor=int32.parse(arguments[arg+1]); } catch(e) { errorchecker(e); } } } console.backgroundcolor = backgroundcolor ; console.foregroundcolor = foregroundcolor ; if ( evaluate ) { output=decodejsstring(output); } if ( newline ) { console.writeline(output); } else { console.write(output); } console.backgroundcolor = currentbackground; console.foregroundcolor = currentforeground; пример coloroutput.bat -s "aanbbnu0025cc" -b 10 -f 3 -n -eвы также можете проверить функцию цвета карлоса -> <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=4453">http://www.dostips.com/forum/viewtopic.php?f=3&t=4453 

да, это возможно с <a href="https://github.com/jeremejevs/cmdcolor"><strong>cmdcolor</strong> :echo 033[32mhi 033[92mworld hi будет темно-зеленого цвета, а world - светло-зеленого цвета.

несколько методов рассматриваются в "51} как я могу отображать строки разных цветов в скриптах nt?" <a href="http://www.netikka.net/tsneti/info/tscmd051.htm">http://www.netikka.net/tsneti/info/tscmd051.htm  одна из альтернатив: если вы можете заполучить qbasic, использовать цвета относительно просто: @echo off & setlocal enableextensions for /f "tokens=" %%f in ("%temp%") do set temp_=%%~sf set skip= findstr "'%skip%qb" "%~f0" > %temp_%tmp$$$.bas qbasic /run %temp_%tmp$$$.bas for %%f in (%temp_%tmp$$$.bas) do if exist %%f del %%f endlocal & goto :eof :: cls 'qb color 14,0 'qb print "a simple "; 'qb color 13,0 'qb print "color "; 'qb color 14,0 'qb print "demonstration" 'qb print "by prof. (emer.) timo salmi" 'qb print 'qb for j = 0 to 7 'qb for i = 0 to 15 'qb color i, j 'qb print ltrim$(str$(i)); " "; ltrim$(str$(j)); 'qb color 1, 0 'qb print " "; 'qb next i 'qb print 'qb next j 'qb system 'qb 

вы должны скачать chgcolor.zip с <a href="http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html">http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html , а также скачать echoj .zip от www.mailsend-online.com/blog/?p=41 они находятся внизу страницы . извлеките обе папки на рабочий стол и скопируйте исполняемые файлы (файлы .exe) из извлеченных папок в каталог c:windows. это позволит им выполняться из командной строки . откройте блокнот и скопируйте в него следующее:<blockquote> @ эхо выключено chgcolor 03 echoj "привет" chgcolor 0d эхой "мир" chgcolor 07 echoj $ 0a</p> </blockquote><p>сохраните файл на рабочий стол как hi.bat. теперь откройте командную строку и перейдите в папку «рабочий стол» и введите «hi.bat» без кавычек. это должно помочь вам начать читать обе веб-страницы, чтобы получить полное руководство.</p>

<p>если вы не используете более старую операционную систему, я считаю, что это невозможно сделать с помощью доступных вам команд.</p><p>однако еще не все потеряно, посмотрите на эту страницу:</p><p> <a href="http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html">http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html</a> </p><p>это, вероятно, даст вам то, что вам нужно, но недостатком является то, что вам нужно добавить утилиты на этой странице.</p>

<p>если ваша консоль поддерживает цветовые коды ansi (например, <a href="http://conemu.github.io/">conemu</a> , <a href="https://github.com/mridgers/clink">clink</a> или <a href="https://github.com/adoxa/ansicon">ansicon</a> ), вы можете сделать это:</p><pre><code>set gray=%esc%[0m set red=%esc%[1;31m set green=%esc%[1;32m set orange=%esc%[0;33m set blue=%esc%[0;34m set magenta=%esc%[0;35m set cyan=%esc%[1;36m set white=%esc%[1;37m </code></pre><p>где переменная esc содержит символ ascii 27.</p><p>я нашел способ заполнить переменную esc здесь: <a href="http://www.dostips.com/forum/viewtopic.php?p=6827#p6827">http://www.dostips.com/forum/viewtopic.php?p=6827#p6827</a> и с помощью <code>tasklist</code> можно проверить, какие библиотеки dll загружены в процесс. </p><p>следующий скрипт получает идентификатор процесса cmd.exe, в котором выполняется скрипт. проверяет, есть ли у него dll, добавляющая добавленную поддержку ansi, а затем задает переменные цвета, чтобы содержать escape-последовательности или быть пустыми в зависимости от того, поддерживается ли цвет или нет.</p><pre><code>@echo off call :init\_colors echo %red%red %green%green %orange%orange %blue%blue %magenta%magenta %cyan%cyan %white%white %gray%gray :: pause if double clicked on instead of run from command line. set interactive=0 echo %cmdcmdline% | findstr /l %comspec% >nul 2>&1 if %errorlevel% == 0 set interactive=1 @rem echo %cmdcmdline% %comspec% %interactive% if "%interactive%"=="1" pause exit /b 0 goto :eof :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: : subroutines : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: :::::::::::::::::::::::::::::::: :init\_colors :::::::::::::::::::::::::::::::: call :supportsansi if errorlevel 1 ( set green= set red= set gray= set white= set orange= set cyan= ) else ( :: if you can, insert ascii char 27 after equals and remove bl.string.createdel\_esc routine set "esc=" :: use this if can't type esc char, it's more verbose, but you can copy and paste it call :bl.string.createdel\_esc set gray=%esc%[0m set red=%esc%[1;31m set green=%esc%[1;32m set orange=%esc%[0;33m set blue=%esc%[0;34m set magenta=%esc%[0;35m set cyan=%esc%[1;36m set white=%esc%[1;37m ) exit /b :::::::::::::::::::::::::::::::: :bl.string.createdel\_esc :::::::::::::::::::::::::::::::: :: http://www.dostips.com/forum/viewtopic.php?t=1733 :: :: creates two variables with one character del=ascii-08 and esc=ascii-27 :: del and esc can be used with and without delayedexpansion setlocal for /f "tokens=1,2 delims=#" %%a in ('"prompt #$h#$e# & echo on & for %%b in (1) do rem"') do ( endlocal set "del=%%a" set "esc=%%b" goto :eof ) :::::::::::::::::::::::::::::::: :supportsansi :::::::::::::::::::::::::::::::: :: returns errorlevel 0 - yes, 1 - no :: :: - tests for conemu, ansicon and clink :: - returns 1 - no support, when called via "cmd /d" (i.e. no autoruns / dll injection) :: on a system that would otherwise support ansi. if "%conemuansi%" == "on" exit /b 0 call :getpid pid setlocal for /f usebackq^ delims^=^"^ tokens^=^* %%a in (`tasklist /fi "pid eq %pid%" /m /fo csv`) do set "modules=%%a" set modules=%modules:"=% set non\_ansi\_modules=%modules% :: strip out ansi dlls from module list: :: ansicon adds ansi64.dll or ansi32.dll set "non\_ansi\_modules=%non\_ansi\_modules:ansi=%" :: conemu attaches conemuhk but conemu also sets conemuansi environment var :: so we've already checked for that above and returned early. @rem set "non\_ansi\_modules=%non\_ansi\_modules:conemuhk=%" :: clink supports ansi https://github.com/mridgers/clink/issues/54 set "non\_ansi\_modules=%non\_ansi\_modules:clink\_dll=%" if "%modules%" == "%non\_ansi\_modules%" endlocal & exit /b 1 endlocal exit /b 0 :::::::::::::::::::::::::::::::: :getpid [rtnvar] :::::::::::::::::::::::::::::::: :: requirements: :: :: determine the process id of the currently executing script, :: but in a way that is multiple execution safe especially when the script can be executing multiple times :: - at the exact same time in the same millisecond, :: - by multiple users, :: - in multiple window sessions (rdp), :: - by privileged and non-privileged (e.g. administrator) accounts, :: - interactively or in the background. :: - work when the cmd.exe window cannot appear :: e.g. running from taskscheduler as local service or using the "run whether user is logged on or not" setting :: :: https://social.msdn.microsoft.com/forums/vstudio/en-us/270f0842-963d-4ed9-b27d-27957628004c/what-is-the-pid-of-the-current-cmdexe?forum=msbuild :: :: http://serverfault.com/a/654029/306 :: :: store the process id (pid) of the currently running script in environment variable rtnvar. :: if called without any argument, then simply write the pid to stdout. :: :: setlocal disabledelayedexpansion :getlock set "lock=%temp%\%~nx0.%time::=.%.lock" set "uid=%lock:\=:b%" set "uid=%uid:,=:c%" set "uid=%uid:'=:q%" set "uid=%uid:\_=:u%" setlocal enabledelayedexpansion set "uid=!uid:%%=:p!" endlocal & set "uid=%uid%" 2>nul ( 9>"%lock%" ( for /f "skip=1" %%a in ( 'wmic process where "name='cmd.exe' and commandline like '%%<%uid%>%%'" get parentprocessid' ) do for %%b in (%%a) do set "pid=%%b" (call ) ))||goto :getlock del "%lock%" 2>nul endlocal & if "%~1" equ "" (echo(%pid%) else set "%~1=%pid%" exit /b </code></pre>