Como ecoar com cores diferentes na linha de comando do Windows

217

Eu sei que o color bfcomando define as cores de toda a janela da linha de comando, mas eu queria imprimir uma única linha em uma cor diferente.

rui
fonte
1
Parece que não existe uma maneira simples de adicionar os códigos de cores de escape à linha de comando do Windows. :(
rui 12/01
rui, se Win10 é uma versão OS aceitável, veja a resposta de Jens - deve ser exatamente o que você precisa, já que esta questão nunca aceitou uma resposta há sete anos: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck
1
Possível duplicata de Como ter várias cores em um arquivo em lotes do Windows?
Micha Wiedenmann

Respostas:

284

Eu queria imprimir uma única linha em uma cor diferente.

Use seqüências de escape ANSI.

Windows anterior a 10 - sem suporte nativo para cores ANSI no console

Para a versão do Windows abaixo de 10, o console de comando do Windows não suporta a coloração de saída por padrão. Você pode instalar o Cmder , ConEmu , ANSICON ou Mintty (usado por padrão no GitBash e Cygwin) para adicionar suporte a cores no console de comando do Windows.

Windows 10 - Cores da linha de comando

A partir do Windows 10, o console do Windows suporta sequências de escape ANSI e algumas cores por padrão. O recurso enviado com a atualização do limite 2 em novembro de 2015.

Documentação MSDN

Atualização (05-2019): O ColorTool permite alterar o esquema de cores do console. Faz parte do projeto Microsoft Terminal .

Demo

insira a descrição da imagem aqui

Comando em lote

O win10colors.cmdfoi 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
fonte
11
@Jens A. Koch - ele não está funcionando no meu windows 10 console (cmd)
user3057544
40
Está bem. Obrigado pelo feedback. .cmdou .bat- ambos devem funcionar. Mas acho que sei por que não funciona: parece que o símbolo de escape é removido ao postar no StackOverflow. Por favor, não copie o conteúdo da minha resposta, use o conteúdo daqui: gist.githubusercontent.com/mlocati/…
Jens A. Koch
28
Eu nunca tinha que gerar um ESCno bloco de notas ++ antes ... Você pode fazer isso com Alt-códigos usando o teclado numérico e a tecla ALT esquerda: L-ALT+ 0+ 2+7
kayleeFrye_onDeck
3
Aliás, como alguém que faz e usa muitos lotes na maioria dos dias, essa resposta aprimorou meu conjunto de ferramentas geral de uma maneira estética! Usando VB? De jeito nenhum. Este é o caminho a seguir!
precisa saber é o seguinte
4
Você pode gerar um ESCpersonagem em um arquivo de lote da seguinte forma:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini
56

Este é um híbrido bat / .net auto-compilado (deve ser salvo como .BAT) que pode ser usado em qualquer sistema que tenha instalado o framework .net (é raro ver uma janela sem o .NET framework, mesmo para o XP / 2003 mais antigo instalações). Ele usa o compilador jscript.net para criar um exe capaz de imprimir seqüências de caracteres com cores diferentes de plano de fundo / primeiro plano apenas para a linha atual.

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

Aqui está a mensagem de ajuda:

insira a descrição da imagem aqui

Exemplo :

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

Você também pode encontrar esse script aqui .

Você também pode verificar a função de cor de carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

npocmaka
fonte
13
Quão legal é isso. Um arquivo bat que compila o jscript que está nele e somente se for necessário - estou bem impressionado. Nem sabia que havia um compilador jscript sentado ali esperando para ser usado. Você recebe meu "prêmio incrível" do mês. Você deve mencionar que o primeiro uso dele será lento (por causa da compilação).
Graham
4
Não preciso de cores o suficiente para chegar a esse extremo, mas a técnica é realmente impressionante e posso me ver usando isso em outro lugar.
EM0
47

Essa não é uma ótima resposta, mas se você sabe que a estação de trabalho de destino possui o Powershell, pode fazer algo assim (assumindo o script BAT / CMD):

CALL:ECHORED "Print me in red!"

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

Edit: (agora mais simples!)

É uma resposta antiga, mas pensei em esclarecer e simplificar um pouco

img

O PowerShell agora está incluído em todas as versões do Windows desde 7. Portanto, a sintaxe desta resposta pode ser reduzida para uma forma mais simples:

  • o caminho não precisa ser especificado, pois já deve estar na variável de ambiente.
  • comandos inequívocos podem ser abreviados . Por exemplo, você pode:
    • use em -forevez de-foregroundcolor
    • use em -backvez de-backgroundcolor
  • o comando também pode ser basicamente usado ' inline ' no lugar de echo
    (em vez de criar um arquivo em lotes separado, como acima).

Exemplo:

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

Mais Informações:

A lista completa de cores e mais informações está disponível em
- Documentação do PowerShell paraWrite-Host

Iain
fonte
14
Greate, funciona para mim, mas é muitoooooooooooooo lento.
Wener
4
Eu percebo que esta é uma resposta que fornece uma solução, mas PowerShell? ugh.
SgtPooki
2
Por isso comecei com "Esta não é uma ótima resposta". Eu gosto bastante do PowerShell, mas é um exagero. O ANSICON é melhor se você puder implementá-lo nas máquinas de destino.
Iain
Obrigado por esta resposta. Eu olhei alto e baixo para uma maneira de ecoar saída colorida de um arquivo em lotes no Powershell e este foi o único. Não sei por que demora tanto para realmente imprimi-lo (há uma espera de 1 segundo em cada chamada), mas pelo menos eu posso fazê-lo. Obrigado!
pizzafilms
29

Windows 10 - TH2 e superior:

(aka Versão 1511, build 10586, versão 10/11/2015)

No prompt de comando:

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

Usando as teclas reais: eco Ctrl+ [[32m HI Ctrl+[[0mEnter

Você deve ver um "HI" verde abaixo dele.

Os números de código podem ser encontrados aqui:

Bloco de anotações:

Para salvar isso no bloco de notas, você pode digitar ESC usando: Alt+ 027com o teclado numérico e depois a [32mparte. Outro truque, quando eu estava em um laptop, redirecione a linha acima para um arquivo para começar e, em seguida, recorte e cole:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
Gringo Suave
fonte
3
Alt + 027 era exatamente o que eu precisava!
Aleksander Stelmaczonek
1
Alt + 027 não funciona no Eclipse / Java .. também tentei \033mas não ... como eu poderia fazer isso em Java?
derHugo 22/07/19
no windows 10 e superior, isso funciona no editor do DOS e do Notepad ++. Obrigado!
Junior Mayhé
17

Você pode apenas criar arquivos com o nome da palavra a imprimir, usar findstr que pode imprimir em cores e depois apagar o arquivo. Tente este exemplo:

@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

Corra color /?para obter uma lista de cores.

Tutankhamen
fonte
3
Isso define as cores na linha de comando do Windows. Você poderia explicar o que faz?
FeatureCreep
2
Ok, ele apenas cria arquivos com o nome da palavra a ser impressa, usa findstr que pode imprimir em cores e depois apaga o arquivo.
FeatureCreep
2
Isso é impressionante! Observe que os códigos de cores estão incorretos. Execute "cor /?" para ver os códigos de cores reais.
yoyo
3
Observe que o findstr pode apenas colorir o nome do arquivo , o que significa que você não pode usar esse truque para cadeias que contenham caracteres de caminho ilegais.
yoyo
3
Observe também que isso substituirá os arquivos no mesmo diretório se eles compartilharem o nome do que você está tentando imprimir ... isso não é bom.
BrainSlugs83
14

Você pode usar o ANSICON para ativar os códigos de terminal ANSI nas versões mais antigas do Windows. Existem versões de 32 e 64 bits que usei no Windows XP e Windows 7.

Bryan Ash
fonte
Não é possível fazê-lo funcionar no Windows 8.1. Falhando toda vez que tento instalar.
EHerman
@EHerman Talvez esta pergunta ajude.
Bryan Ash
O ANSICON não é necessário nas versões posteriores do Win 10. Não tente usá-lo lá.
Gringo Suave
6

Também fiquei irritado com a falta de cores adequadas no cmd, então fui em frente e criei o cmdcolor . É apenas um proxy stdout, que procura um conjunto limitado de seqüências de controle ANSI / VT100 (em outras palavras, como no bash), ie echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Uso e downloads .

Alec Mev
fonte
Isso é legal, e eu o coloquei no sistema de menus de um script de construção gigante no meu trabalho. A única coisa que tenho é que o binário que você fornece nessa página tem como alvo 64 bits, para que não funcione em nossa máquina de compilação de 32 bits. Mas não havia problema em apenas pegar a fonte e me compilar.
paddy
Mas é de 32 bits :) Aqui está a saída do arquivo GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev
Isso é estranho ... O XP Pro se recusou a executá-lo, mas correu bem na minha caixa Win7 64. Compilei com o Visual C ++, visando o Win32, e estava tudo bem.
paddy
Huh ... provavelmente por causa de upx. Você poderia entrar em contato comigo por e-mail, por favor?
Alec Mev
6

Eu olhei para isso porque queria introduzir algumas cores de texto simples em um arquivo em lote do Win7. Isto é o que eu vim com. Obrigado pela ajuda.

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

Já existe uma resposta aceita com mais de 250 votos positivos. A razão pela qual ainda estou contribuindo é que o escapecaractere necessário para ecoar não é aceito por muitos editores (estou usando, por exemplo, MS Code) e todas as outras soluções exigem alguns softwares de terceiros (que não sejam padrão do Windows).

A solução alternativa usando apenas comandos simples de lote está usando em PROMPTvez de ECHO. O PROMPTcomando aceita o escapecaractere de maneira amigável a qualquer editor como uma $Esequência de caracteres. (Basta substituir a Escnos códigos ASCII de escape ) com $E.

Aqui está um código de demonstração:

@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: A única desvantagem é que essa técnica colide com as configurações de cores do cmd do usuário ( colorcomando ou configurações) se não for conhecido explicitamente.

- Espero que isso ajude, pois esta é a única solução aceitável para mim pelas razões mencionadas no início. -

EDITAR:

Com base nos comentários, estou anexando outro trecho inspirado em @Jeb. Isto:

  • Mostra como obter e usar o tempo de execução do caractere "Esc" (em vez de inseri-lo em um editor) (solução de Jeb)
  • Usa ECHOcomando "nativo"
  • Portanto, não afeta o PROMPTvalor local
  • Demonstra que a coloração da ECHOsaída afeta inevitavelmente a PROMPTcor e, portanto, ela deve ser redefinida
@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
fonte
Técnica muito interessante. Vou ver se preciso atualizar o github.com/VonC/batcolors com ele. Votado.
VonC 23/01
@VonC Você pode simplesmente criar uma variável, contendo o caractere de escape, sem a necessidade de inseri-la no editor. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb 23/01
@jeb Você quer dizer "em vez de echousado em batcolors / echo.bat "?
VonC 23/01
@VonC Sim, substitua o seu set ASCII27=←por for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Isso usa o caractere de escape criado pelo comando prompt, sem alterar o prompt permanentemente (porque o promptcomando é executado em um processo filho). Btw. O seu echos.battem algum potencial de otimização ...
jeb
@jeb "Seu echos.bat tem algum potencial de otimização": tenho certeza disso :) Solicitações Pull são bem-vindas (tanto para o ASCII27 quanto para outras otimizações)
VonC
4

Estou adicionando uma resposta para resolver um problema observado em alguns comentários acima: que os códigos de cores ansi em linha podem se comportar mal quando dentro de um loop FOR (na verdade, dentro de qualquer bloco de código entre parênteses). O código .bat abaixo demonstra (1) o uso de códigos de cores embutidos, (2) a falha de cores que pode ocorrer quando códigos de cores embutidos são usados ​​em um loop FOR ou dentro de um bloco de código entre parênteses, e (3) uma solução para o problema. Quando o código .bat é executado, os testes 2 e 3 demonstram a falha do código de cores e o teste 4 não mostra falhas porque implementa a solução.

[EDIT 2020-04-07: Encontrei outra solução presumivelmente mais eficiente do que chamar uma sub-rotina. Coloque a frase FINDSTR entre parênteses, como na seguinte linha:

   echo success | (findstr /R success)

ENDEDIT]

Nota: Na minha experiência (limitada), o problema do código de cores se manifesta somente depois que a entrada é canalizada para FINDSTR dentro do bloco de código. É assim que o seguinte .bat reproduz o problema. É possível que o problema do código de cores seja mais geral do que após a tubulação para o FINDSTR. Se alguém puder explicar a natureza do problema e se houver uma maneira melhor de resolvê-lo, eu agradeceria.

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

Acabei de converter do Win 7 Home para o Win 10 Pro e queria substituir o lote que chamo de outros lotes para fazer eco das informações em cores. Revendo o que foi discutido acima, uso o seguinte, que substituirá diretamente meu lote anterior. NOTA a adição de "~" à mensagem para que as mensagens com espaços possam ser usadas. Em vez de me lembrar dos códigos, uso letras para as cores necessárias.

Se% 2 contiver espaços, é necessário "..."% 1 Cores fortes em preto: R = Vermelho G = VERDE Y = AMARELO W = BRANCO

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
fonte
0

Você precisará repetir uma sequência de código de escape ANSI para alterar a cor do texto: http://en.wikipedia.org/wiki/ANSI_escape_code

Outra fonte muito boa desses códigos de escape é http://ascii-table.com/ansi-escape-sequences.php

Bernhard Hofmann
fonte
Isso parece realmente promissor, mas como emito o caractere Escape - ASCII 27 em um comando echo?
rui
10
O console do Windows não é um emulador de terminal. As seqüências de escape ANSI simplesmente não podem funcionar. Você pode convencer o Windows 9x a fazê-lo carregando o ANSI.SYS, mas já estamos um pouco longe disso.
Joey
0

Coloque as seguintes linhas em um arquivo chamado ColourText.basna área de trabalho.

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

Salve-o e digite o seguinte em um prompt de comando.

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

Um arquivo chamado ColourText.exe aparecerá na sua área de trabalho. Mova-o para a pasta do Windows .

Para usar, você deve usar dois códigos de caracteres para definir a cor, por exemplo, 01não 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

Para definir azul no branco, não passando nenhum texto, depois vermelho no branco, terminando com azul no cinza.

ColourText F1 F1
ColourText F2 71 This is green on white

ou

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

Também o CLScomando se torna interessante. ColorO comando sem parâmetros redefine todas as cores para as cores de inicialização.

Para obter o código de cores, adicione os seguintes números. Use a Calculadora no modo de programadores. Estes são números hexadecimais. Eles podem ser adicionados juntos, por exemplo, Vermelho + Azul + FG Intensidade = 13 = D. Como 10+ não foi usado, o fundo será preto. Os códigos de cores DEVEM ter dois caracteres, por exemplo, 08não 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.

fonte
2
Embora interessante, nem todo mundo terá o SDK instalado, de fato, pouquíssimas pessoas, eu acho.
Abel
0

Para começar este trabalho no Windows 10, você pode ativar esta bandeira: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Com essa chave do registro, você pode definir isso por padrão

[HKCU\Console] VirtualTerminalLevel dword 0x1

Michel de Groot
fonte
0

Uma alternativa é usar o NodeJS .

Aqui está um exemplo:

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

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

E este é o resultado:

insira a descrição da imagem aqui

Josem
fonte
0

Como Glenn Slayden disse nesta resposta , você pode adicionar ao registro o valor adequado para tornar o cmd "mais colorido".

Felizmente, o padrão global pode ser alterado de opt-in para opt-out. A chave do Registro em HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel define o comportamento padrão global para o processamento de seqüências de escape ANSI. Crie uma chave DWORD (se necessário) e defina seu valor como 1 para ativar globalmente (ou 0 para desativar`) o processamento ANSI por padrão.

torswq
fonte
0

Definir cores para as instruções de log no PowerShell não é um grande negócio. você pode usar o -ForegroundColorparâmetro

Para escrever uma mensagem de confirmação.

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

Para escrever uma mensagem de erro.

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

Para escrever uma mensagem de progresso .

Write-Host "Working under pocess..." -ForegroundColor Green
Erro_
fonte
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
fonte
%ESC%está vazio, então isso não funcionará. echo !white!define a cor para branco. Para retornar às cores padrão (quaisquer que sejam as configurações do usuário): o colorcomando sem parâmetros faz isso.
Stephan
-1

Costumávamos fazer isso com códigos de terminal ANSI . Não tenho certeza se eles ainda funcionam, mas você pode experimentá-los.

Michael J
fonte
1
Esta poderia ser uma boa resposta se ele explicou como usar esses códigos de terminal ANSI ...
Davor Josipovic
1
Eu pensei que o artigo ao qual vinculava o explicasse. Você leu isso? BTW: diz que eles não funcionam no win32.
Michael J
Na diagonal. O artigo explica o que são códigos de terminal ANSI, mas não como realmente usá-los no cmd, para responder à pergunta. (Sim ... o fato de que Win32 console não é suportado os torna um pouco irrelevante para a questão.)
Davor Josipovic
1
Você apenas repetiria os códigos ANSI para o terminal. por exemplo, "eco ← [6m" definiria a cor do texto do terminal para 6 (vermelho). Nota "←" é ASCII 27 (escape). Você pode digitar pressionando "ALT" e digitando "27" no teclado numérico. Eu apenas pesquisei no Google e descobri que você ainda pode usar o comando "color" para fazer a mesma coisa (embora os códigos numéricos sejam diferentes). "cor 4" fornece texto em vermelho.
Michael J
-6

Você pode usar o comando color para alterar a cor de todo o console

Color 0F

É preto e branco

Color 0A 

É preto e verde

dan tauro
fonte
20
Bom saber. Infelizmente, isso muda a cor de todo o console e a questão é como mudar uma única linha (ou uma parte dela) ..
Lucas
6
O OP declarou que ele está familiarizado com este comando e que o problema é que ele altera o console inteiro e não uma linha específica.
Randall Flagg
5
Sim, de fato, não é realmente responsivo, mas ainda é útil saber.
precisa saber é o seguinte