¿Cómo tener múltiples colores en un archivo por lotes de Windows?

Me preguntaba si es posible tener texto de diferentes colores en la misma línea en un archivo por lotes de Windows, por ejemplo, si dice

echo hi world 

Quiero que “hola” sea un color y que “mundo” sea otro color. Tal vez podría establecer el comando COLOR como una variable:

 set color1= color 2 set color9= color A 

y luego desplegarlos a ambos en la misma línea junto con

 echo hi world 

pero no sé cómo haría eso.

En realidad, esto se puede hacer sin crear un archivo temporal. El método descrito por jeb y dbenham funcionará incluso con un archivo de destino que no contenga retrocesos. El punto crítico es que la línea reconocida por findstr.exe no debe terminar con un CRLF. Así que el archivo de texto obvio para escanear con una línea que no termina con un CRLF es el lote de invocación en sí mismo, ¡siempre que lo terminemos con esa línea! Aquí hay un script de ejemplo actualizado que funciona de esta manera …

Cambios desde el ejemplo anterior:

  • Utiliza un solo trazo en la última línea como cadena de búsqueda. (Debe ser corto y no aparecer en ningún otro lugar como este en el lote).
  • Las rutinas y variables renombradas son un poco más orientadas a objetos 🙂
  • Se eliminó un nivel de llamada para mejorar ligeramente el rendimiento.
  • Comentarios añadidos (A partir de: # para que se parezca más a la mayoría de los otros lenguajes de scripting).

 @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!"=="" " 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. - 

PD. Estoy teniendo un problema con la salida de! personaje que no tenías en el ejemplo anterior. (O al menos no tuvo los mismos síntomas). Para ser investigado.

Puede hacer salidas multicolores sin ningún progtwig externo.

 @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  "%~2" findstr /v /a:%1 /R "^$" "%~2" nul del "%~2" > nul 2>&1 goto :eof 

Utiliza la función de color del comando findstr.

Findstr se puede configurar para generar números de línea o nombres de archivo en un color definido.
Así que primero creo un archivo con el texto como nombre de archivo, y el contenido es un único carácter (ASCII 8).
Luego busco todas las líneas no vacías en el archivo y en nul, por lo que el nombre del archivo se imprimirá en el color correcto con dos puntos, pero el espacio se eliminará inmediatamente con el .

EDITAR: Un año después … todos los personajes son válidos

 @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  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  

Esto usa la regla para una ruta / nombre de archivo válidos.
Si un \..\ está en la ruta, el elemento elemet prefijado se eliminará completamente y no es necesario que este elemento contenga solo caracteres de nombre de archivo válidos.

La respuesta editada de jeb se acerca a resolver todos los problemas. Pero tiene problemas con las siguientes cadenas:

 "a\b\" "a/b/" "\" "/" "." ".." "c:" 

Modifiqué su técnica a algo que creo que realmente puede manejar cualquier cadena de caracteres imprimibles, a excepción de las limitaciones de longitud.

Otras mejoras:

  • Utiliza la ubicación% TEMP% para el archivo temporal, por lo que ya no necesita acceso de escritura al directorio actual.

  • Creado 2 variantes, una toma una cadena literal, el otro el nombre de una variable que contiene la cadena. La versión variable generalmente es menos conveniente, pero elimina algunos problemas especiales de escape de caracteres.

  • Se agregó la opción / n como tercer parámetro opcional para agregar una nueva línea al final de la salida.

El retroceso no funciona en un salto de línea, por lo que la técnica puede tener problemas si la línea se ajusta. Por ejemplo, imprimir una cadena con una longitud entre 74 – 79 no funcionará correctamente si la consola tiene un ancho de línea de 80.

 @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" "%temp%\x" set /p "=%DEL%%DEL%%DEL%%DEL%%DEL%%DEL%.%DEL%" exit /b :cleanupColorPrint del "%temp%\x" exit /b 

ACTUALIZACIÓN 2012-11-27

Este método falla en XP porque FINDSTR muestra un retroceso como un punto en la pantalla. La respuesta original de jeb funciona en XP, aunque con las limitaciones ya notadas

ACTUALIZACIÓN 2012-12-14

Ha habido mucha actividad de desarrollo en DosTips y SS64 . Resulta que FINDSTR también corrompe los nombres de archivos que contienen ASCII extendido si se suministran en la línea de comandos. Actualicé mi FIN & Q de preguntas y respuestas .

A continuación se muestra una versión que funciona en XP y admite TODOS los caracteres de un solo byte excepto 0x00 (nul), 0x0A (avance de línea) y 0x0D (retorno de carro). Sin embargo, cuando se ejecuta en XP, la mayoría de los caracteres de control se mostrarán como puntos. Esta es una característica inherente de FINDSTR en XP que no se puede evitar.

Desafortunadamente, agregar soporte para XP y para caracteres ASCII extendidos ralentiza la rutina 🙁

Solo por diversión, tomé un poco de arte ASCII en color de la galería de arte ASCII de joan stark y lo adapté para usarlo con ColorPrint. Agregué un punto de entrada: c solo para taquigrafía, y para manejar un problema con literales de comillas.

 @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 colorPrint.txt (echo %%s\..\') findstr /a:%~1 /f:colorPrint.txt "." "%temp%\'" set /p "=." subst ': "%temp%" >nul exit /b :cleanupColorPrint 2>nul del "%temp%\'" 2>nul del "%temp%\colorPrint.txt" >nul subst ': /d exit /b 

Si tiene un Windows moderno (que tiene instalado PowerShell), lo siguiente también puede funcionar bien

 call :PrintBright Something Something (do actual batch stuff here) call :PrintBright Done! goto :eof :PrintBright powershell -Command Write-Host "%*" -foreground "White" 

Ajuste el color como mejor le parezca.

Sin herramientas externas . Se trata de un híbrido bat / .net autocomstackdo (se debe guardar como .BAT ) que se puede utilizar en cualquier sistema que tenga .NET Framework instalado (es raro ver una ventana sin .NET framework incluso para las instalaciones más antiguas de XP / 2003). Utiliza el comstackdor jscript.net para crear un exe capaz de imprimir cadenas con diferentes colores de fondo / primer plano solo para la línea actual.

 @if (@X)==(@Y) @end /* JScript comment @echo off setlocal for /f "tokens=* delims=" %%v in ('dir /b /s /a:-d /o:-n "%SystemRoot%\Microsoft.NET\Framework\*jsc.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 \\n\\b\\r 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; 

Ejemplo coloroutput.bat -s "aa\nbb\n\u0025cc" -b 10 -f 3 -n -e

También puede verificar la función de color de carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

Combinando la syntax y el pájaro de dbenham con el método powershell write-host skrebbel , parece que powershell puede renderizar arte complejo más rápidamente que el método de lote puro de dbenham (bueno, después de que powershell haya sido preparado una vez, de todos modos). Se necesita un masaje mínimo de las cuerdas, aunque no he probado esto con otra cosa que no sea el pájaro. Si desea un personaje verde shiny al final de la transmisión, por ejemplo, puede que no tenga suerte. 🙂

Este método requiere hacer eco en un archivo temporal, simplemente porque se invoca PowerShell para cada call :c toma para siempre, y es mucho más rápido poner en cola la salida para una invocación de PowerShell. Pero tiene la ventaja de la simplicidad y la eficiencia.

 @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    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 

Resultado:

enter image description here

Solo para completar este tema, también puede mostrar texto en color usando mi progtwig auxiliar ColorShow.exe; Puede descargarlo desde este sitio , busque el progtwig # 12. Tenga en cuenta que la primera parte de la documentación aparece en el progtwig # 2-Show.exe.

Hay varios progtwigs auxiliares en ese sitio que permiten lograr algunas cosas interesantes. Por ejemplo, el progtwig # 6-CursorPos.exe permite mover el cursor a cualquier lugar de la pantalla.

Este es un ejemplo de salida producido por un archivo por lotes utilizando mi progtwig auxiliar ColorShow.exe:

Mona Lisa

El archivo por lotes tomó menos de 3 segundos para mostrar la imagen anterior, que tiene una resolución de 322×138 (usando la fuente Lucida Console @ tamaño 5). Puede revisar el método utilizado para producir esta imagen en esta publicación .

EDITAR : Publiqué un método mucho más simple para obtener el progtwig ColorShow.exe y una breve descripción de él; solo sigue este enlace

Sí, es posible con cmdcolor :

 echo \033[32mhi \033[92mworld 

hi será verde oscuro, y verde claro del world .

Debe descargar chgcolor.zip desde http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html y también descargar echoj.zip desde http://www.mailsend-online.com / blog /? p = 41 Ambos están hacia la parte inferior de la página. Extraiga ambas carpetas en el escritorio y copie los ejecutables (archivos .exe) desde el interior de las carpetas extraídas al directorio C: \ Windows. Esto les permitirá ser ejecutados desde la línea de comando. Abre el bloc de notas y copia lo siguiente en él:

@echo off

chgcolor 03

echoj “hola”

chgcolor 0d

echoj “mundo”

chgcolor 07

echoj $ 0a

Guarde el archivo en el escritorio como hi.bat. Ahora abra el símbolo del sistema y navegue a su carpeta de escritorio y escriba “hi.bat” sin las comillas. Eso debería ayudarte a comenzar a leer ambas páginas web para obtener un tutorial completo.

Varios métodos están cubiertos en
“51} ¿Cómo puedo hacer eco de líneas en diferentes colores en scripts NT?”
http://www.netikka.net/tsneti/info/tscmd051.htm

Una de las alternativas: si puede hacerse con QBASIC, usar colores es relativamente fácil:

  @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 

A menos que esté usando un sistema operativo anterior, creo que esto no es posible con los comandos disponibles para usted.

Sin embargo, no todo está perdido, eche un vistazo a esta página:

http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html

Esto le dará exactamente lo que necesita, pero el inconveniente es que necesita agregar las utilidades en esa página.

Si su consola admite códigos de color ANSI (por ejemplo, ConEmu , Clink o ANSICON ) puede hacer esto:

 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 

donde la variable ESC contiene el carácter ASCII 27.

Encontré una forma de completar la variable ESC aquí: http://www.dostips.com/forum/viewtopic.php?p=6827#p6827 y al usar la tasklist , es posible probar qué archivos DLL están cargados en un proceso.

El siguiente script obtiene el ID del proceso de cmd.exe en el que se ejecuta el script. Comprueba si tiene un dll que agregará el soporte ANSI inyectado, y luego establece las variables de color para que contengan secuencias de escape o que esté vacío dependiendo de si el color es compatible. o no.

 @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" (ie 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 (eg Administrator) accounts, :: - interactively or in the background. :: - work when the cmd.exe window cannot appear :: eg 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 

All alternatives described thus far use any temporary files. This is bad, it is not always possible to use temporary files. This script below uses no temporary file and can write text on any screen position. The best script for this purpose is this