Cómo hacer eco con diferentes colores en la línea de comando de Windows

217

Sé que el color bfcomando establece los colores de toda la ventana de la línea de comando, pero quería imprimir una sola línea en un color diferente.

rui
fuente
1
Parecería que no hay una manera simple de agregar los códigos de color escapados a la línea de comando de Windows. :(
rui
rui, si Win10 es una versión de SO aceptable, consulte la respuesta de Jens: debería ser exactamente lo que necesita, ya que esta pregunta nunca aceptó una respuesta hace siete años: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Respuestas:

284

Quería imprimir una sola línea en un color diferente.

Use secuencias de escape ANSI.

Windows antes de 10: no hay soporte nativo para colores ANSI en la consola

Para la versión de Windows inferior a 10, la consola de comandos de Windows no admite el color de salida de forma predeterminada. Puede instalar Cmder , ConEmu , ANSICON o Mintty (usado por defecto en GitBash y Cygwin) para agregar soporte de color a su consola de comandos de Windows.

Windows 10 - Colores de línea de comando

A partir de Windows 10, la consola de Windows admite secuencias de escape ANSI y algunos colores de forma predeterminada. La función se envió con la actualización del umbral 2 en noviembre de 2015.

Documentación de MSDN

Actualización (05-2019): ColorTool le permite cambiar la combinación de colores de la consola. Es parte del proyecto Microsoft Terminal .

Manifestación

enter image description here

Comando por lotes

El win10colors.cmdfue escrito por Michele Locati :

@echo off
cls
echo [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m                     [31mred foreground color[0m
echo ^<ESC^>[7m                      [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m                   [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m
Jens A. Koch
fuente
11
@Jens A. Koch: no funciona en mi consola de Windows 10 (cmd)
user3057544
40
Okay. Gracias por la respuesta. .cmdo .bat- ambos deberían funcionar. Pero creo que sé por qué no funciona: parece que el símbolo de escape se elimina al publicar en StackOverflow. No copie el contenido de mi respuesta, use el contenido de aquí en su lugar: gist.githubusercontent.com/mlocati/…
Jens A. Koch
28
Nunca tuve que generar un ESCNotepad ++ antes ... Puede hacer esto con códigos ALT usando el teclado numérico y la tecla ALT izquierda: L-ALT+ 0+ 2+7
kayleeFrye_onDeck
3
Por cierto, como alguien que hace y usa muchos lotes la mayoría de los días, ¡esta respuesta ha mejorado mi conjunto de herramientas en general de una manera estética! Usando VB? Diablos no Este es el camino a seguir!
kayleeFrye_onDeck
44
Puede generar un ESCpersonaje en un archivo Batch de esta manera:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini
56

Este es un auto compilado híbrido bat / .net (debe guardarse como .BAT) que se puede usar en cualquier sistema que tenga instalado .net framework (es raro ver una ventana sin .NET framework incluso para el XP / 2003 más antiguo instalaciones). Utiliza el compilador 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;

Aquí está el mensaje de ayuda:

ingrese la descripción de la imagen aquí

Ejemplo :

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

También puedes encontrar este script aquí .

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

npocmaka
fuente
13
Cuan genial es eso. Un archivo bat que compila el jscript que está en él y solo si es necesario, estoy muy impresionado. Ni siquiera sabía que había un compilador jscript simplemente sentado allí esperando a ser utilizado. Obtienes mi "premio increíble" por el mes. Debe mencionar que el primer uso será lento (debido a la compilación).
Graham
44
No necesito el color lo suficiente como para llegar a este extremo, pero la técnica es realmente impresionante y puedo verme usando eso en otro lugar.
EM0
47

Esta no es una gran respuesta, pero si sabe que la estación de trabajo de destino tiene Powershell, puede hacer algo como esto (suponiendo un script BAT / CMD):

CALL:ECHORED "Print me in red!"

:ECHORED
%Windir%\System32\WindowsPowerShell\v1.0\Powershell.exe write-host -foregroundcolor Red %1
goto:eof

Editar: (ahora más simple!)

Es una respuesta antigua pero pensé que aclararía y simplificaría un poco

img

PowerShell ahora se incluye en todas las versiones de Windows desde 7. Por lo tanto, la sintaxis de esta respuesta se puede acortar a una forma más simple:

  • no es necesario especificar la ruta , ya que debería estar en la variable de entorno ya.
  • los comandos no ambiguos se pueden abreviar . Por ejemplo puedes:
    • usar en -forelugar de-foregroundcolor
    • usar en -backlugar de-backgroundcolor
  • el comando también se puede usar básicamente 'en línea ' en lugar de echo
    (en lugar de crear un archivo por lotes separado como se indicó anteriormente).

Ejemplo:

powershell write-host -fore Cyan This is Cyan text
powershell write-host -back Red This is Red background

Más información:

La lista completa de colores y más información está disponible en
- Documentación de PowerShell paraWrite-Host

Iain
fuente
14
Greate, funciona para mí, pero es demasiado lento.
Wener
44
Me doy cuenta de que esta es una respuesta que proporciona una solución, pero ¿PowerShell? ugh
SgtPooki
2
Es por eso que comencé con "Esta no es una gran respuesta". Me gusta bastante Powershell, pero es excesivo para esto. ANSICON es mejor si puede hacer frente a la implementación en las máquinas de destino.
Iain
Gracias por esta respuesta He buscado por todas partes una forma de hacer eco de la salida en color de un archivo por lotes en Powershell y esta fue la única. No estoy seguro de por qué lleva tanto tiempo imprimirlo (hay una espera de 1 segundo con cada llamada), pero al menos puedo hacerlo. ¡Gracias!
pizzafilms
29

Windows 10 - TH2 y superior:

(también conocida como Versión 1511, compilación 10586, versión 2015-11-10)

En el símbolo del sistema:

echo ^[[32m HI ^[[0m

Usando las teclas reales: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Debería ver un "HI" verde debajo de él.

Los números de código se pueden encontrar aquí:

Bloc:

Para guardar esto en el bloc de notas, puede escribir ESC usando: Alt+ 027con el teclado numérico, luego la [32mparte. Otro truco cuando estaba en una computadora portátil, redirige la línea de arriba a un archivo para comenzar, luego corta y pega:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
Gringo Suave
fuente
3
¡Alt + 027 era exactamente lo que necesitaba!
Aleksander Stelmaczonek
1
Alt + 027 no funciona en Eclipse / Java ... también lo intenté \033pero no ... ¿cómo podría hacer esto en Java?
derHugo
en Windows 10 y superior, esto funciona en el editor DOS y Notepad ++. ¡Gracias!
Junior Mayhé
17

Simplemente puede crear archivos con el nombre de la palabra para imprimir, usar findtr que puede imprimir en color y luego borrar el archivo. Prueba este ejemplo:

@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 :ColorText 0a "green"
call :ColorText 0C "red"
call :ColorText 0b "cyan"
echo(
call :ColorText 19 "blue"
call :ColorText 2F "white"
call :ColorText 4e "yellow"

goto :eof

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

correr color /? para obtener una lista de colores.

Tutankamón
fuente
3
Esto establece los colores en la línea de comando de Windows. ¿Podría explicar qué hace?
FeatureCreep
2
Ok, solo crea archivos con el nombre de la palabra para imprimir, usa findtr que puede imprimir en color y luego borra el archivo.
FeatureCreep
2
¡Eso es impresionante! Tenga en cuenta que los códigos de color son incorrectos. Ejecute "color /?" para ver los códigos de color reales.
yoyo
3
Tenga en cuenta que findtr solo puede colorear el nombre del archivo , lo que significa que no puede usar este truco para las cadenas que contienen caracteres de ruta ilegales.
yoyo
3
También cabe destacar que esto sobrescribirá los archivos en el mismo directorio si comparten el nombre de lo que está intentando imprimir ... eso no es bueno en absoluto.
BrainSlugs83
14

Puede usar ANSICON para habilitar códigos de terminal ANSI en versiones anteriores de Windows. Hay versiones de 32 y 64 bits que he usado en Windows XP y Windows 7.

Bryan Ash
fuente
No puedo hacer que funcione en Windows 8.1. Fallo cada vez que intento instalarlo.
EHerman
@EHerman Quizás esta pregunta ayude.
Bryan Ash
ANSICON no es necesario en versiones posteriores de Win 10. No intente usarlo allí.
Gringo Suave
6

También me molestó la falta de coloración adecuada en cmd, así que seguí adelante y creé cmdcolor . Es solo un proxy estándar, que busca un conjunto limitado de secuencias de control ANSI / VT100 (en otras palabras, como en bash), es decirecho \033[31m RED \033[0m DEFAULT | cmdcolor.exe .

Uso y descargas .

Alec Mev
fuente
Esto es genial, y lo he puesto en el sistema de menús de un script de construcción gigante en mi trabajo. Lo único que tengo es que el binario que proporciona en esa página está dirigido a 64 bits, por lo que no funcionará en nuestra máquina de compilación de 32 bits. Pero no fue problema simplemente tomar la fuente y compilarme.
arroz
Pero es de 32 bits :) Aquí está la salida del archivo GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev
Eso es extraño ... XP Pro se negó a ejecutarlo, pero funcionó bien en mi caja Win7 64. Compilé con Visual C ++, apuntando a Win32, y estuvo bien.
arroz
Eh ... probablemente por eso upx. ¿Podría contactarme por correo electrónico, por favor?
Alec Mev
6

Miré esto porque quería introducir algunos colores de texto simples a un archivo Win7 Batch. Esto es lo que se me ocurrió. Gracias por tu ayuda.

@echo off
cls && color 08

rem .... the following line creates a [DEL] [ASCII 8] [Backspace] character to use later
rem .... All this to remove [:]
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (set "DEL=%%a")

echo.

<nul set /p="("
call :PainText 09 "BLUE is cold"    && <nul set /p=")  ("
call :PainText 02 "GREEN is earth"  && <nul set /p=")  ("
call :PainText F0 "BLACK is night"  && <nul set /p=")"
echo.
<nul set /p="("
call :PainText 04 "RED is blood"    && <nul set /p=")  ("
call :PainText 0e "YELLOW is pee"   && <nul set /p=")  ("
call :PainText 0F "WHITE all colors"&& <nul set /p=")"

goto :end

:PainText
<nul set /p "=%DEL%" > "%~2"
findstr /v /a:%1 /R "+" "%~2" nul
del "%~2" > nul
goto :eof

:end
echo.
pause
Nick-n-Chicago
fuente
5

Ya hay una respuesta aceptada con más de 250 votos a favor. La razón por la que sigo contribuyendo es que elescape carácter requerido para hacer eco no es aceptado por muchos editores (estoy usando, por ejemplo, MS Code) y todas las demás soluciones requieren algunas piezas de software de terceros (que no son Windows por defecto).

La solución alternativa con el uso de comandos por lotes simples se está utilizando en PROMPTlugar de ECHO. El PROMPTcomando acepta el escapecarácter de una manera amigable para cualquier editor como una $Esecuencia de caracteres. (Simplemente reemplace el Escen los códigos de escape ASCII ) con $E.

Aquí hay un código de demostración:

@ECHO OFF

    :: Do not pollute environment with the %prompt.bak% variable
    :: ! forgetting ENDLOCAL at the end of the batch leads to prompt corruption
    SETLOCAL

    :: Old prompt settings backup
    SET prompt.bak=%PROMPT%

    :: Entering the "ECHO"-like section

        :: Forcing prompt to display after every command (see below)
        ECHO ON

        :: Setting the prompt using the ANSI Escape sequence(s)
        :: - Always start with $E[1A, otherwise the text would appear on a next line
        :: - Then the decorated text follows
        :: - And it all ends with $E30;40m, which makes the following command invisible
        ::   - assuming default background color of the screen
        @ PROMPT $E[1A$E[30;42mHELLO$E[30;40m

        :: An "empty" command that forces the prompt to display. 
        :: The word "rem" is displayed along with the prompt text but is made invisible
        rem

        :: Just another text to display
        @ PROMPT $E[1A$E[33;41mWORLD$E[30;40m
        rem

        :: Leaving the "ECHO"-like section
        @ECHO OFF

    :: Or a more readable version utilizing the cursor manipulation ASCII ESC sequences

        :: the initial sequence
        PROMPT $E[1A
        :: formating commands
        PROMPT %PROMPT%$E[32;44m
        :: the text
        PROMPT %PROMPT%This is an "ECHO"ed text...
        :: new line; 2000 is to move to the left "a lot"
        PROMPT %PROMPT%$E[1B$E[2000D
        :: formating commands fro the next line
        PROMPT %PROMPT%$E[33;47m
        :: the text (new line)
        PROMPT %PROMPT%...spreading over two lines
        :: the closing sequence
        PROMPT %PROMPT%$E[30;40m

        :: Looks like this without the intermediate comments:
        :: PROMPT $E[1A
        :: PROMPT %PROMPT%$E[32;44m
        :: PROMPT %PROMPT%This is an "ECHO"ed text...
        :: PROMPT %PROMPT%$E[1B$E[2000D
        :: PROMPT %PROMPT%$E[33;47m
        :: PROMPT %PROMPT%...spreading over two lines
        :: PROMPT %PROMPT%$E[30;40m

        :: show it all at once!
        ECHO ON
        rem
        @ECHO OFF

    :: End of "ECHO"-ing

    :: Setting prompt back to its original value
    :: - We prepend the settings with $E[37;40m in case
    ::   the original prompt settings do not specify color
    ::   (as they don't by default).
    :: - If they do, the $E[37;40m will become overridden, anyway.
    :: ! It is important to write this command 
    ::   as it is with `ENDLOCAL` and in the `&` form.
    ENDLOCAL & PROMPT $E[37;40m%prompt.bak%

EXIT /B 0

NOTA: El único inconveniente es que esta técnica colisiona con la configuración de color cmd del usuario (color comando o configuración) si no se conoce explícitamente.

- Espero que esto ayude, ya que esta es la única solución aceptable para mí por las razones mencionadas al principio. -

EDITAR:

Según los comentarios, adjunto otro fragmento inspirado en @Jeb. Eso:

  • Muestra cómo obtener y usar el tiempo de ejecución del personaje "Esc" (en lugar de ingresarlo a un editor) (solución de Jeb)
  • Utiliza ECHOcomandos "nativos"
  • Por lo tanto, no afecta local PROMPT valor .
  • Demuestra que colorear el ECHOresultado inevitablemente afecta el PROMPTcolor, por lo que el color debe restablecerse, de todos modos
@ECHO OFF

    :: ! To observe color effects on prompt below in this script
    ::   run the script from a fresh cmd window with no custom
    ::   prompt settings

    :: Only not to pollute the environment with the %\e% variable (see below)
    :: Not needed because of the `PROMPT` variable
    SETLOCAL

        :: Parsing the `escape` character (ASCII 27) to a %\e% variable
        :: Use %\e% in place of `Esc` in the [http://ascii-table.com/ansi-escape-sequences.php]
        FOR /F "delims=#" %%E IN ('"prompt #$E# & FOR %%E IN (1) DO rem"') DO SET "\e=%%E"

        :: Demonstrate that prompt did not get corrupted by the previous FOR
        ECHO ON
        rem : After for
        @ECHO OFF

        :: Some fancy ASCII ESC staff
        ECHO [          ]
        FOR /L %%G IN (1,1,10) DO (
            TIMEOUT /T 1 > NUL
            ECHO %\e%[1A%\e%[%%GC%\e%[31;43m.
            ECHO %\e%[1A%\e%[11C%\e%[37;40m]
        )

        :: ECHO another decorated text
        :: - notice the `%\e%[30C` cursor positioning sequence
        ::   for the sake of the "After ECHO" test below
        ECHO %\e%[1A%\e%[13C%\e%[32;47mHELLO WORLD%\e%[30C

        :: Demonstrate that prompt did not get corrupted by ECHOing
        :: neither does the cursor positioning take effect.
        :: ! But the color settings do.
        ECHO ON
        rem : After ECHO
        @ECHO OFF

    ENDLOCAL

    :: Demonstrate that color settings do not reset
    :: even when out of the SETLOCAL scope
    ECHO ON
    rem : After ENDLOCAL
    @ECHO OFF

    :: Reset the `PROMPT` color
    :: - `PROMPT` itself is untouched so we did not need to backup it.
    :: - Still ECHOING in color apparently collide with user color cmd settings (if any).
    :: ! Resetting `PROMPT` color this way extends the `PROMPT`
    ::   by the initial `$E[37;40m` sequence every time the script runs.
    :: - Better solution then would be to end every (or last) `ECHO` command
    ::   with the `%\e%[37;40m` sequence and avoid setting `PROMPT` altogether.
    ::   which makes this technique preferable to the previous one (before EDIT)
    :: - I am keeping it this way only to be able to
    ::   demonstrate the `ECHO` color effects on the `PROMPT` above.
    PROMPT $E[37;40m%PROMPT%

    ECHO ON
    rem : After PROMPT color reset
    @ECHO OFF

EXIT /B 0
PavDub
fuente
Técnica muy interesante Veré si necesito actualizar github.com/VonC/batcolors con él. Votado
VonC
@VonC Simplemente puede crear una variable que contenga el carácter de escape, sin la necesidad de ingresarla en el editor. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb
@jeb ¿Quiere decir "en lugar de echousado en batcolors / echo.bat "?
VonC
@VonC Sí, reemplace su set ASCII27=←con for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Esto utiliza el carácter de escape creado por el comando de solicitud, sin cambiar la solicitud de forma permanente (porque el promptcomando se ejecuta en un proceso secundario). Por cierto. Su echos.battiene un potencial de optimización ...
Jeb
@jeb "Su echos.bat tiene un potencial de optimización": estoy seguro :) Las solicitudes de extracción son bienvenidas (tanto para el ASCII27 como para otras optimizaciones)
VonC
4

Estoy agregando una respuesta para abordar un problema señalado en algunos comentarios anteriores: que los códigos de color ansi en línea pueden comportarse mal cuando están dentro de un bucle FOR (en realidad, dentro de cualquier bloque de código entre paréntesis). El siguiente código .bat demuestra (1) el uso de códigos de color en línea, (2) la falla de color que puede ocurrir cuando los códigos de color en línea se usan en un bucle FOR o dentro de un bloque de código entre paréntesis, y (3) una solución para el problema. Cuando se ejecuta el código .bat, las pruebas 2 y 3 demuestran la falla del código de color, y la prueba 4 no muestra ninguna falla porque implementa la solución.

[EDITAR 2020-04-07: Encontré otra solución que presumiblemente es más eficiente que llamar a una subrutina. Encierre la frase FINDSTR entre paréntesis, como en la siguiente línea:

   echo success | (findstr /R success)

ENDEDIT]

Nota: En mi experiencia (limitada), el problema del código de color se manifiesta solo después de que la entrada se canaliza a FINDSTR dentro del bloque de código. Así es como el siguiente .bat reproduce el problema. Es posible que el problema del código de color sea más general que después de conectarlo a FINDSTR. Si alguien puede explicar la naturaleza del problema, y ​​si hay una mejor manera de resolverlo, lo agradecería.

@goto :main
:resetANSI
EXIT /B
rem  The resetANSI subroutine is used to fix the colorcode
rem  bug, even though it appears to do nothing.

:main
@echo off
setlocal EnableDelayedExpansion

rem  Define some useful colorcode vars:
for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ESCchar=%%E"
set "green=%ESCchar%[92m"
set "yellow=%ESCchar%[93m"
set "magenta=%ESCchar%[95m"
set "cyan=%ESCchar%[96m"
set "white=%ESCchar%[97m"
set "black=%ESCchar%[30m"

echo %white%Test 1 is NOT in a FOR loop nor within parentheses, and color works right.
   echo %yellow%[Test 1] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.%yellow%
   echo %green%This is green.
echo %cyan%Test 1 completed.

echo %white%Test 2 is within parentheses, and color stops working after the pipe to FINDSTR.
(  echo %yellow%[Test 2] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 2 completed.

echo %white%Test 3 is within a FOR loop, and color stops working after the pipe to FINDSTR.
for /L %%G in (3,1,3) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   echo %magenta%This is supposed to be magenta and FINDSTR found and displayed 'success'.
   echo %green%This is supposed to be green.
)
echo %cyan%Test 3 completed.

echo %white%Test 4 is in a FOR loop but color works right because subroutine :resetANSI is 
echo called after the pipe to FINDSTR, before the next color code is used.
for /L %%G in (4,1,4) do (
   echo %yellow%[Test %%G] %green%This is Green, %magenta%this is Magenta, and %yellow%this is Yellow.
   echo %Next, the string 'success' will be piped to FINDSTR...
   echo success | findstr /R success
   call :resetANSI
   echo %magenta%This is magenta and FINDSTR found and displayed 'success'.
   echo %green%This is green.
)
echo %cyan%Test 4 completed.%white%

EXIT /B
Dolores Stevens
fuente
1

Acabo de convertir de Win 7 Home a Win 10 Pro y quería reemplazar el lote que llamo de otros lotes para hacer eco de la información en color. Al revisar lo que se discutió anteriormente, uso lo siguiente que reemplazará directamente a mi lote anterior. NOTA la adición de "~" al mensaje para que se puedan usar mensajes con espacios. En lugar de recordar códigos, uso letras para los colores que necesitaba.

Si% 2 contiene espacios requiere "..."% 1 Colores fuertes en negro: R = Rojo G = VERDE Y = AMARILLO W = BLANCO

ECHO OFF
IF "%1"=="R" ECHO ^[91m%~2[0m
IF "%1"=="G" ECHO ^[92m%~2[0m
IF "%1"=="Y" ECHO ^[93m%~2[0m
IF "%1"=="W" ECHO ^[97m%~2[0m
ebloch
fuente
0

Tendrá que repetir una secuencia de código de escape ANSI para alterar el color del texto: http://en.wikipedia.org/wiki/ANSI_escape_code

Otra muy buena fuente de estos códigos de escape es http://ascii-table.com/ansi-escape-sequences.php

Bernhard Hofmann
fuente
Eso parece muy prometedor, pero ¿cómo puedo emitir el carácter Escape - ASCII 27 en un comando echo?
rui
10
La consola de Windows no es un emulador de Terminal. Las secuencias de escape ANSI simplemente no pueden funcionar. Puede convencer a Windows 9x para que lo haga cargando ANSI.SYS, pero ya estamos un poco más allá de eso.
Joey
0

Ponga las siguientes líneas en un archivo llamado ColourText.basen su escritorio.

Imports System
Imports System.IO
Imports System.Runtime.InteropServices
Imports Microsoft.Win32

Public Module MyApplication  
Public Declare Function GetStdHandle Lib "kernel32" Alias "GetStdHandle" (ByVal nStdHandle As Long) As Long
Public Declare Function SetConsoleTextAttribute Lib "kernel32" Alias "SetConsoleTextAttribute" (ByVal hConsoleOutput As Long, ByVal wAttributes As Long) As Long
Public Const STD_ERROR_HANDLE = -12&
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

Sub Main()
    Dim hOut as Long
    Dim Ret as Long
    Dim Colour As Long
    Dim Colour1 As Long
    Dim Text As String
    hOut  = GetStdHandle(STD_OUTPUT_HANDLE)
    Colour = CLng("&h" & Split(Command(), " ")(0))
    Colour1 = Clng("&h" & Split(Command(), " ")(1))
    Text = Mid(Command(), 7)
    Ret = SetConsoleTextAttribute(hOut,  Colour)
    Console.Out.WriteLine(text)
    Ret = SetConsoleTextAttribute(hOut, Colour1)
End Sub
End Module

Guárdelo y escriba lo siguiente en un símbolo del sistema.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\vbc.exe" /target:exe /out:"%userprofile%\desktop\ColourText.exe" "%userprofile%\desktop\ColourText.bas" /verbose

Un archivo llamado ColourText.exe aparecerá en su escritorio. Muévalo a la carpeta de Windows .

Para usar debe usar dos códigos de caracteres para establecer el color, por ejemplo, 01no 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

Por ejemplo, establecer azul sobre blanco sin pasar ningún texto, luego rojo sobre blanco, terminando con azul sobre gris.

ColourText F1 F1
ColourText F2 71 This is green on white

o

ColourText F1 F1
cls
ColourText F4 F4
Echo Hello
Echo Hello today
ColourText F1 F1

También el CLScomando se vuelve interesante. ColorEl comando sin parámetros restablece todos los colores a los colores de inicio.

Para obtener el código de color, agregue los siguientes números. Utilice la calculadora en modo programadores. Estos son números hexadecimales. Se pueden agregar juntos, por ejemplo, Rojo + Azul + FG Intensidad = 13 = D. Como no se utilizó 10+, el fondo será negro. Los códigos de color DEBEN tener dos caracteres, por ejemplo, 08no 8.

FOREGROUND_RED = &H4     '  text color contains red.
FOREGROUND_INTENSITY = &H8     '  text color is intensified.
FOREGROUND_GREEN = &H2     '  text color contains green.
FOREGROUND_BLUE = &H1     '  text color contains blue.
BACKGROUND_BLUE = &H10    '  background color contains blue.
BACKGROUND_GREEN = &H20    '  background color contains green.
BACKGROUND_INTENSITY = &H80    '  background color is intensified.
BACKGROUND_RED = &H40    '  background color contains red.

fuente
2
Si bien es interesante, no todos tendrán el SDK instalado, de hecho, creo que muy pocas personas.
Abel
0

Para que esto funcione en Windows 10, puede activar esta bandera: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Con esta clave de registro puede configurar esto de manera predeterminada

[HKCU\Console] VirtualTerminalLevel dword 0x1

Michel de Groot
fuente
0

Una alternativa es usar NodeJS .

Aquí hay un ejemplo:

const os = require('os');
const colors = require('colors');

console.log("Operative System:".green,os.type(),os.release());
console.log("Uptime:".blue,os.uptime());

Y este es el resultado:

ingrese la descripción de la imagen aquí

Josem
fuente
0

Como Glenn Slayden dijo en esta respuesta , puede agregar al registro el valor adecuado para hacer que el cmd sea "más colorido".

Afortunadamente, el valor predeterminado global se puede cambiar de habilitar a inhabilitar. La clave de registro en HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel establece el comportamiento predeterminado global para procesar secuencias de escape ANSI. Cree una clave DWORD (si es necesario) y establezca su valor en 1 para habilitar globalmente (o 0 para deshabilitar`) el procesamiento ANSI de forma predeterminada.

torswq
fuente
0

Establecer color en las declaraciones de registro en powershell no es un gran amigo. Puedes usar el -ForegroundColorparámetro.

Para escribir un mensaje de confirmación.

Write-Host "Process executed Successfully...." -ForegroundColor Magenta

Para escribir un mensaje de error.

Write-Host "Sorry an unexpected error occurred.." -ForegroundColor Red

Para escribir un mensaje de progreso .

Write-Host "Working under pocess..." -ForegroundColor Green
Insecto_
fuente
0
call :color_echo "blue" "blue txt"
call :color_echo "red" "red txt"
echo "white txt"


REM : https://www.robvanderwoude.com/ansi.php
:color_echo
    @echo off

    set "color=%~1"
    set "txt=%~2"

    set ESC=
    set black=%ESC%[30m
    set red=%ESC%[31m
    set green=%ESC%[32m
    set yellow=%ESC%[33m
    set blue=%ESC%[34m
    set magenta=%ESC%[35m
    set cyan=%ESC%[36m
    set white=%ESC%[37m

    if "%~1" == "black"   set "color=!black!"
    if "%~1" == "red"     set "color=!red!"
    if "%~1" == "green"   set "color=!green!"
    if "%~1" == "yellow"  set "color=!yellow!"
    if "%~1" == "blue"    set "color=!blue!"
    if "%~1" == "magenta" set "color=!magenta!"
    if "%~1" == "cyan"    set "color=!cyan!"
    if "%~1" == "white"   set "color=!white!"

    echo | set /p="!color!!txt!"
    echo.

    REM : return to standard white color
    echo | set /p="!white!"

    REM : exiting the function only
    EXIT /B 0
Jamaledine Amarir
fuente
%ESC%está vacío, por lo que esto no funcionará. echo !white!establece el color en blanco. Para volver a los colores predeterminados (cualesquiera que sean las configuraciones de usuario para eso): el colorcomando sin parámetros hace eso.
Stephan
-1

Solíamos hacer esto con los códigos de terminal ANSI . No estoy seguro si todavía funcionan, pero puedes probarlos.

Michael J
fuente
1
Esta podría ser una buena respuesta si explicara cómo usar estos códigos de terminal ANSI ...
Davor Josipovic
1
Pensé que el artículo que vinculaba lo explicaba. ¿Leíste eso? Por cierto: dice que no funcionan en win32.
Michael J
Diagonalmente. El artículo explica qué son los códigos de terminal ANSI, pero no cómo usarlos desde cmd, para responder la pregunta. (Sí ... el hecho de que la consola Win32 no sea compatible los hace un poco irrelevantes para la pregunta).
Davor Josipovic,
1
Simplemente haría eco de los códigos ANSI en el terminal. por ejemplo, "echo ← [6m" establecería el color del texto del terminal en 6 (rojo). Nota "←" es ASCII 27 (escape). Puede escribirlo presionando "ALT" y escribiendo "27" en el teclado numérico. Lo busqué en Google y descubrí que todavía puedes usar el comando "color" para hacer lo mismo (aunque los códigos numéricos son diferentes). "color 4" te da el texto rojo.
Michael J
-6

Puede usar el comando de color para cambiar el color de toda la consola

Color 0F

Es blanco y negro

Color 0A 

Es negro y verde

dan tauro
fuente
20
Bueno saber. Desafortunadamente, esto cambia el color de toda la consola y la pregunta es cómo cambiar una sola línea (o una parte de ella) ..
Lucas
66
El OP ha declarado que está familiarizado con este comando y que el problema es que cambia toda la consola y no una línea específica.
Randall Flagg el
55
Sí, de hecho, no es realmente sensible, pero aún así es útil saberlo.
CuriousMarc