Come riecheggiare con colori diversi nella riga di comando di Windows


217

So che il color bfcomando imposta i colori dell'intera finestra della riga di comando ma volevo stampare una singola riga in un colore diverso.


1
Sembrerebbe che io non ci sia un modo semplice per aggiungere i codici colore sfuggiti alla riga di comando di Windows. :(
rui,

rui, se Win10 è una versione accettabile del sistema operativo, controlla la risposta di Jens - dovrebbe essere esattamente quello che ti serve, visto che questa domanda mai accettato una risposta sette anni fa: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Risposte:


284

Volevo stampare una sola riga in un colore diverso.

Usa sequenze di escape ANSI.

Windows prima delle 10 - nessun supporto nativo per i colori ANSI sulla console

Per la versione di Windows inferiore a 10, la console di comando di Windows non supporta la colorazione dell'output per impostazione predefinita. È possibile installare Cmder , ConEmu , ANSICON o Mintty (utilizzati per impostazione predefinita in GitBash e Cygwin) per aggiungere il supporto per la colorazione alla console dei comandi di Windows.

Windows 10 - Colori della riga di comando

A partire da Windows 10 la console di Windows supporta le sequenze di escape ANSI e alcuni colori per impostazione predefinita. La funzionalità è stata fornita con l'aggiornamento Soglia 2 nel novembre 2015.

Documentazione MSDN

Aggiornamento (05-2019): ColorTool consente di modificare la combinazione di colori della console. Fa parte del progetto Microsoft Terminal .

dimostrazione

inserisci qui la descrizione dell'immagine

Comando batch

Il è win10colors.cmdstato scritto da 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

11
@Jens A. Koch - non funziona nella mia console di Windows 10 (cmd)
user3057544

40
Ok. Grazie per il feedback. .cmdoppure .bat- entrambi dovrebbero funzionare. Ma penso di sapere perché non funziona: sembra che il simbolo di escape venga rimosso quando si pubblica su StackOverflow. Per favore, non copiare il contenuto dalla mia risposta, usa invece il contenuto di qui: gist.githubusercontent.com/mlocati/…
Jens A. Koch,

28
Non ho mai dovuto generare un ESCin notepad ++ prima ... Puoi farlo con i codici ALT usando il tastierino numerico e il tasto ALT sinistro: L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
A proposito, come qualcuno che produce e utilizza molti lotti quasi tutti i giorni, questa risposta ha migliorato il mio set di strumenti generale in modo estetico! Usi VB? Diavolo, no. Questa è la strada da percorrere!
kayleeFrye_onDeck

4
Puoi generare un ESCpersonaggio in un file Batch in questo modo:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

Questo è un ibrido bat / .net autocompilato (dovrebbe essere salvato come .BAT) che può essere usato su qualsiasi sistema che abbia installato un framework .net (è raro vedere un windows senza .NET framework anche per il più vecchio XP / 2003 installazioni). Utilizza il compilatore jscript.net per creare un exe in grado di stampare stringhe con colori di sfondo / primo piano diversi solo per la riga corrente.

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

Ecco il messaggio di aiuto:

inserisci qui la descrizione dell'immagine

Esempio :

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

Puoi anche trovare questo script qui .

Puoi anche controllare la funzione colore di Carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
Quant'è fico. Un file bat che compila il jscript che è in esso e solo se necessario - sono ben impressionato. Non sapevo nemmeno che ci fosse un compilatore jscript semplicemente seduto lì in attesa di essere usato. Ottieni il mio "fantastico premio" per il mese. Dovresti menzionare che il primo utilizzo sarà lento (a causa della compilazione).
Graham,

4
Non ho bisogno di colori abbastanza per andare a questo estremo, ma la tecnica è davvero impressionante e posso vedermi usarlo altrove.
EM0,

47

Questa non è un'ottima risposta, ma se sai che la workstation di destinazione ha Powershell puoi fare qualcosa del genere (supponendo uno script BAT / CMD):

CALL:ECHORED "Print me in red!"

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

Modifica: (ora più semplice!)

È una vecchia risposta, ma ho pensato di chiarire e semplificare un po '

img

PowerShell è ora incluso in tutte le versioni di Windows dal 7. Pertanto la sintassi per questa risposta può essere abbreviata in una forma più semplice:

  • il percorso non ha bisogno di essere specificati in quanto dovrebbe essere nella variabile di ambiente già.
  • comandi inequivocabili possono essere abbreviati . Ad esempio puoi:
    • utilizzare -foreinvece di-foregroundcolor
    • utilizzare -backinvece di-backgroundcolor
  • il comando può anche sostanzialmente essere usato ' inline ' al posto di echo
    (piuttosto che creare un file batch separato come sopra).

Esempio:

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

Maggiori informazioni:

L'elenco completo dei colori e ulteriori informazioni sono disponibili nella documentazione di
- PowerShell perWrite-Host



15
Greate, funziona per me, ma è troppo lento.
Wener

4
mi rendo conto che questa è una risposta che fornisce una soluzione, ma PowerShell? ugh.
SgtPooki,

2
Ecco perché ho iniziato con "Questa non è un'ottima risposta". Mi piace abbastanza Powershell ma è eccessivo per questo. ANSICON è meglio se riesci a far fronte alla sua distribuzione sulle macchine target.
Iain

Grazie per questa risposta Ho cercato in alto e in basso un modo per echeggiare l'output colorato da un file batch in Powershell e questo era l'unico. Non sono sicuro del motivo per cui ci vuole così tanto tempo per stamparlo (c'è un'attesa di 1 secondo per ogni chiamata) ma almeno posso farlo. Grazie!
pizzafilms

29

Windows 10 - TH2 e versioni successive:

(aka versione 1511, build 10586, versione 2015-11-10)

Al prompt dei comandi:

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

Usando i tasti attuali: echo Ctrl+ [[32m HI Ctrl+[[0mEnter

Dovresti vedere un "HI" verde sotto di esso.

I numeri di codice sono disponibili qui:

Bloc notes:

Per salvarlo nel blocco note, è possibile digitare ESC in esso usando: Alt+ 027con il tastierino numerico, quindi la [32mparte. Un altro trucco quando ero su un laptop, reindirizza la riga sopra in un file per iniziare, quindi taglia e incolla:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd

3
Alt + 027 era esattamente quello di cui avevo bisogno!
Aleksander Stelmaczonek,

1
Alt + 027 non funziona in Eclipse / Java .. anche provato \033ma no ... come potrei farlo in Java?
derHugo,

su Windows 10 e versioni successive, funziona con l'editor DOS e Notepad ++. Grazie!
Junior Mayhé,

18

Puoi semplicemente creare file con il nome della parola da stampare, utilizzare findstr che può stampare a colori e quindi cancellare il file. Prova questo esempio:

@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

Esegui color /?per ottenere un elenco di colori.


3
Questo imposta i colori nella riga di comando di Windows. Potresti spiegare cosa fa?
FeatureCreep

2
Ok, crea semplicemente file con il nome della parola da stampare, usa findstr che può stampare a colori e quindi cancella il file.
FeatureCreep

2
È impressionante! Si noti che i codici colore sono errati. Esegui "color /?" per vedere i codici colore attuali.
yoyo

3
Nota che findstr può solo colorare il nome del file , il che significa che non puoi usare questo trucco per stringhe che contengono caratteri di percorso illegali.
yoyo

3
Inoltre, questo sovrascriverà i file nella stessa directory se condividono il nome di ciò che stai cercando di stampare ... non va affatto bene.
BrainSlugs83

14

È possibile utilizzare ANSICON per abilitare i codici terminali ANSI nelle versioni precedenti di Windows. Esistono versioni a 32 e 64 bit che ho usato in Windows XP e Windows 7.


Non riesco a farlo funzionare su Windows 8.1. Arresto anomalo ogni volta che provo a installare.
EHerman,

@Eerman Forse questa domanda sarà di aiuto.
Bryan Ash,

ANSICON non è necessario nelle versioni successive di Win 10. Non tentare di usarlo lì.
Gringo Suave,

6

Sono stato infastidito dalla mancanza di una corretta colorazione anche in cmd, quindi sono andato avanti e ho creato cmdcolor . È solo un proxy stdout, che cerca una serie limitata di sequenze di controllo ANSI / VT100 (in altre parole, come in bash), vale a dire echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Utilizzo e download .


Questo è fantastico, e l'ho inserito nel sistema di menu di uno script di build gigante nel mio lavoro. L'unica cosa che ho è che il binario che fornisci su quella pagina ha come target 64-bit, quindi non funzionerà sulla nostra macchina di compilazione a 32 bit. Ma non è stato un problema afferrare la fonte e compilare me stesso.
risaia

Ma è a 32 bit :) Ecco l'output del file GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev

È strano ... XP Pro ha rifiutato di eseguirlo, ma ha funzionato bene sulla mia scatola Win7 64. Ho compilato con Visual C ++, destinato a Win32, e andava bene.
paddy,

Eh ... probabilmente a causa di upx. Potresti contattarmi via e-mail, per favore?
Alec Mev,

6

Ho osservato questo perché volevo introdurre alcuni semplici colori di testo in un file batch di Win7. Questo è quello che mi è venuto in mente. Grazie per l'aiuto.

@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

5

C'è una risposta accettata con oltre 250 voti già. Il motivo per cui sto ancora contribuendo è che ilescape carattere richiesto per l'eco non è accettato da molti editor (sto usando, ad esempio, il codice MS) e tutte le altre soluzioni richiedono alcuni software di terze parti (non di default di Windows).

Al PROMPTposto di usare la soluzione alternativa con l'utilizzo di semplici comandi batch ECHO. Il PROMPTcomando accetta il escapepersonaggio in modo intuitivo con qualsiasi editor come $Esequenza di caratteri. (Sostituisci semplicemente Escnei codici di escape ASCII ) con $E.

Ecco un codice demo:

@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: L'unico inconveniente è che questa tecnica si scontra con le impostazioni di colore cmd dell'utente (color comando o impostazioni) se non conosciute in modo esplicito.

- Spero che questo mi aiuti, poiché questa è l'unica soluzione accettabile per me per i motivi menzionati all'inizio. -

MODIFICARE:

Sulla base dei commenti, allego un altro frammento ispirato a @Jeb. It:

  • Mostra come ottenere e utilizzare il runtime del carattere "Esc" (anziché immetterlo in un editor) (soluzione di Jeb)
  • Utilizza ECHOcomandi "nativi"
  • Quindi non influisce sul PROMPTvalore locale
  • Dimostra che la colorazione ECHOdell'output influisce inevitabilmente sul PROMPTcolore, quindi il colore deve essere ripristinato, comunque
@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

Tecnica molto interessante. Vedrò se devo aggiornare github.com/VonC/batcolors con esso. Upvoted.
VonC

@VonC Puoi semplicemente creare una variabile, contenente il chat di escape, senza la necessità di inserirla nell'editor. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
Jeb

@jeb Intendi "al contrario di echousato in batcolors / echo.bat "?
VonC

@VonC Sì, sostituisci il tuo set ASCII27=←con for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Questo utilizza il carattere di escape creato dal comando prompt, senza modificare il prompt in modo permanente (poiché il promptcomando viene eseguito in un processo figlio). Btw. Il tuo echos.batha un potenziale di ottimizzazione ...
Jeb

@jeb "Il tuo echos.bat ha qualche potenziale di ottimizzazione": ne sono sicuro :) Le richieste pull sono benvenute (sia per l'ASCII27 che per altre ottimizzazioni)
VonC

4

Sto aggiungendo una risposta per risolvere un problema riscontrato in alcuni commenti sopra: che i codici colore ansi in linea possono comportarsi in modo errato quando si trovano all'interno di un ciclo FOR (in realtà, all'interno di qualsiasi blocco di codice tra parentesi). Il codice .bat seguente mostra (1) l'uso di codici colore in linea, (2) il fallimento del colore che può verificarsi quando i codici colore in linea vengono utilizzati in un ciclo FOR o all'interno di un blocco di codice tra parentesi e (3) una soluzione a il problema. Quando viene eseguito il codice .bat, i test 2 e 3 dimostrano l'errore del codice colore e il test 4 non mostra alcun errore poiché implementa la soluzione.

[EDIT 2020-04-07: ho trovato un'altra soluzione che è presumibilmente più efficiente rispetto alla chiamata di una subroutine. Racchiudere la frase FINDSTR tra parentesi, come nella seguente riga:

   echo success | (findstr /R success)

EndEdit]

Nota: nella mia (limitata) esperienza, il problema del codice colore si manifesta solo dopo che l'input è stato reindirizzato a FINDSTR all'interno del blocco di codice. Ecco come il seguente .bat riproduce il problema. È possibile che il problema con il codice colore sia più generale che dopo il piping su FINDSTR. Se qualcuno può spiegare la natura del problema e se esiste un modo migliore per risolverlo, lo apprezzerei.

@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


1

Ho appena convertito da Win 7 Home a Win 10 Pro e volevo sostituire il batch che chiamo da altri batch per riecheggiare le informazioni a colori. Rivedendo quanto discusso sopra, utilizzo quanto segue che sostituirà direttamente il mio batch precedente. NOTA l'aggiunta di "~" al messaggio in modo da poter utilizzare i messaggi con spazi. Invece di ricordare i codici, uso le lettere per i colori di cui avevo bisogno.

Se% 2 contiene spazi richiede "..."% 1 Colori forti sul nero: R = Rosso G = VERDE Y = GIALLO W = BIANCO

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

0

Devi modificare l'eco di una sequenza di codici di escape ANSI per modificare il colore del testo: http://en.wikipedia.org/wiki/ANSI_escape_code

Un'altra ottima fonte di questi codici di escape è http://ascii-table.com/ansi-escape-sequences.php


Sembra davvero promettente, ma come posso emettere il carattere Escape - ASCII 27 in un comando echo?
rui,

10
La console di Windows non è un emulatore di terminale. Le sequenze di escape ANSI semplicemente non possono funzionare. Potresti convincere Windows 9x a farlo caricando ANSI.SYS ma ormai siamo un po 'passati.
Joey,

0

Inserisci le seguenti righe in un file chiamato ColourText.bassul desktop.

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

Salvalo e digita quanto segue in un prompt dei comandi.

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

Un file chiamato ColourText.exe apparirà sul desktop. Spostalo nella cartella Windows .

Per utilizzare è necessario utilizzare due codici di caratteri per impostare il colore, ad esempio 01no 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

Ad esempio, per impostare il blu su bianco non passando alcun testo, quindi il rosso su testo bianco, finendo con il blu sul grigio.

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

Anche il CLScomando diventa interessante.Coloril comando senza parametri reimposta tutti i colori sui colori di avvio.

Per ottenere il codice colore, sommare i seguenti numeri. Utilizzare la calcolatrice in modalità programmatori. Questi sono numeri esadecimali. Possono essere aggiunti insieme, ad esempio Rosso + Blu + Intensità FG = 13 = D. Poiché non sono stati utilizzati 10+, lo sfondo sarà nero. Codici colore deve essere due personaggi, per esempio 08non 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.

3
Sebbene interessante, non tutti avranno installato l'SDK, in effetti, pochissime persone, penso.
Abele,

0

Per ottenere questo lavoro su Windows 10, è possibile attivare questo flag: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Con questa chiave di registro puoi impostarla per impostazione predefinita

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

Un'alternativa è usare NodeJS .

Ecco un esempio:

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

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

E questo è il risultato:

inserisci qui la descrizione dell'immagine


0

Come ha affermato Glenn Slayden in questa risposta , è possibile aggiungere al registro il valore corretto per rendere il cmd "più colorato".

Fortunatamente, il default globale può essere modificato da opt-in a opt-out. La chiave del Registro di sistema in HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel imposta il comportamento predefinito globale per l'elaborazione delle sequenze di escape ANSI. Creare una chiave DWORD (se necessario) e impostarne il valore su 1 per abilitare globalmente (o 0 per disabilitare`) l'elaborazione ANSI per impostazione predefinita.


0

L'impostazione del colore per le dichiarazioni del registro in PowerShell non è un grande amico. puoi usare il -ForegroundColorparametro.

Per scrivere un messaggio di conferma.

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

Per scrivere un messaggio di errore.

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

Per scrivere un messaggio di avanzamento .

Write-Host "Working under pocess..." -ForegroundColor Green

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

%ESC%è vuoto, quindi non funzionerà. echo !white!imposta il colore su bianco. Per tornare ai colori predefiniti (indipendentemente dalle impostazioni dell'utente): il colorcomando senza parametri lo fa.
Stephan,

-1

Lo facevamo con i codici terminali ANSI . Non sono sicuro che funzionino ancora, ma potresti provarli.


1
Questa potrebbe essere una buona risposta se spiegasse come usare questi codici terminali ANSI ...
Davor Josipovic

1
Ho pensato che l'articolo a cui ho collegato lo spiegasse. L'hai letto? A proposito: dice che non funzionano su Win32.
Michael J,

In diagonale. L'articolo spiega quali sono i codici terminali ANSI, ma non come usarli da cmd, quindi per rispondere alla domanda. (Sì ... il fatto che la console Win32 non sia supportata li rende un po 'irrilevanti per la domanda.)
Davor Josipovic,

1
Dovresti semplicemente fare l'eco dei codici ANSI sul terminale. es. "echo ← [6m" imposta il colore del testo del terminale su 6 (rosso). Nota "←" è ASCII 27 (escape). È possibile digitarlo tenendo premuto "ALT" e digitando "27" sul tastierino numerico. Ho appena cercato su Google e ho scoperto che puoi ancora usare il comando "color" per fare la stessa cosa (anche se i codici numerici sono diversi). "color 4" ti dà il testo rosso.
Michael J,

-6

È possibile utilizzare il comando color per modificare il colore dell'intera console

Color 0F

È in bianco e nero

Color 0A 

È nero e verde


20
Bello sapere. Purtroppo questo cambia il colore dell'intera console e la domanda è come cambiare una singola riga (o parte di essa) ..
Luca

6
L'OP ha dichiarato di avere familiarità con questo comando e che il problema è che cambia l'intera console e non una riga specifica.
Randall Flagg,

5
Sì, in effetti non è veramente reattivo, ma è comunque utile saperlo.
CuriousMarc,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.