Comment faire écho avec différentes couleurs dans la ligne de commande Windows


217

Je sais que la color bfcommande définit les couleurs de toute la fenêtre de ligne de commande, mais je voulais imprimer une seule ligne dans une couleur différente.


1
Il semblerait qu'il n'y ait pas de moyen simple d'ajouter les codes de couleurs échappés à la ligne de commande Windows. :(
rui

rui, si Win10 est une version de système d'exploitation acceptable, consultez la réponse de Jens - cela devrait être exactement ce dont vous avez besoin, car cette question n'a jamais accepté de réponse il y a sept ans: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Réponses:


285

Je voulais imprimer une seule ligne dans une couleur différente.

Utilisez les séquences d'échappement ANSI.

Windows avant 10 - pas de prise en charge native des couleurs ANSI sur la console

Pour la version Windows inférieure à 10, la console de commande Windows ne prend pas en charge la coloration de sortie par défaut. Vous pouvez installer Cmder , ConEmu , ANSICON ou Mintty (utilisé par défaut dans GitBash et Cygwin) pour ajouter un support de coloration à votre console de commande Windows.

Windows 10 - Couleurs de ligne de commande

À partir de Windows 10, la console Windows prend en charge les séquences d'échappement ANSI et certaines couleurs par défaut. La fonctionnalité a été livrée avec la mise à jour Threshold 2 en novembre 2015.

Documentation MSDN

Mise à jour (05-2019): ColorTool vous permet de changer le jeu de couleurs de la console. Cela fait partie du projet Microsoft Terminal .

Démo

entrez la description de l'image ici

Commande par lots

Le a win10colors.cmdété écrit par 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 - cela ne fonctionne pas dans ma console Windows 10 (cmd)
user3057544

40
D'accord. Merci pour les commentaires. .cmdou .bat- les deux devraient fonctionner. Mais, je pense que je sais pourquoi cela ne fonctionne pas: il semble que le symbole d'échappement soit supprimé lors de la publication sur StackOverflow. Veuillez ne pas copier le contenu de ma réponse, utilisez plutôt le contenu d'ici: gist.githubusercontent.com/mlocati/…
Jens A. Koch

28
Je n'ai jamais eu à générer un ESCbloc-notes ++ auparavant ... Vous pouvez le faire avec des codes ALT en utilisant le pavé numérique et la touche ALT gauche: L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
Btw, en tant que personne qui fabrique et utilise beaucoup de lots la plupart du temps, cette réponse a amélioré mon ensemble d'outils de manière esthétique! Vous utilisez VB? Sûrement pas. C'est la voie à suivre!
kayleeFrye_onDeck

4
Vous pouvez générer un ESCpersonnage dans un fichier batch de cette façon:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

Ceci est un auto-compilé hybride bat / .net (doit être enregistré sous .BAT) qui peut être utilisé sur n'importe quel système qui a installé le framework .net (il est rare de voir une fenêtre sans framework .NET même pour le plus ancien XP / 2003 installations). Il utilise le compilateur jscript.net pour créer un exe capable d'imprimer des chaînes avec différentes couleurs d'arrière-plan / de premier plan uniquement pour la ligne actuelle.

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

Voici le message d'aide:

entrez la description de l'image ici

Exemple :

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

Vous pouvez également trouver ce script ici .

Vous pouvez également vérifier la fonction de couleur de Carlos -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453


13
À quel point cela est cool. Un fichier bat qui compile le jscript qui s'y trouve et seulement s'il en a besoin - je suis bien impressionné. Je ne savais même pas qu'il y avait un compilateur jscript juste assis là attendant d'être utilisé. Vous obtenez mon "super prix" pour le mois. Vous devez mentionner que sa première utilisation sera lente (à cause de la compilation).
Graham

4
Je n'ai pas assez besoin de couleur pour aller à cet extrême, mais la technique est vraiment impressionnante et je peux me voir l'utiliser ailleurs.
EM0

47

Ce n'est pas une bonne réponse, mais si vous savez que le poste de travail cible a Powershell, vous pouvez faire quelque chose comme ça (en supposant que le 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: (maintenant plus simple!)

C'est une vieille réponse mais j'ai pensé que je clarifierais et simplifierais un peu

img

PowerShell est désormais inclus dans toutes les versions de Windows depuis 7. Par conséquent, la syntaxe de cette réponse peut être raccourcie en une forme plus simple:

  • le chemin n'a pas besoin d'être spécifié car il devrait déjà être dans la variable d'environnement.
  • les commandes non ambiguës peuvent être abrégées . Par exemple, vous pouvez:
    • utiliser -foreau lieu de-foregroundcolor
    • utiliser -backau lieu de-backgroundcolor
  • la commande peut également être utilisé essentiellement « en ligne » à la place de echo
    (plutôt que de créer un fichier de lot séparé comme ci - dessus).

Exemple:

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

Plus d'information:

La liste complète des couleurs et plus d'informations sont disponibles dans la
- PowerShell Documentation forWrite-Host



15
Greate, ça marche pour moi, mais c'est trop lent.
wener

4
je me rends compte que c'est une réponse apportant une solution, mais PowerShell? Pouah.
SgtPooki

2
C'est pourquoi j'ai commencé par "Ce n'est pas une excellente réponse". J'aime bien Powershell mais c'est exagéré pour ça. ANSICON est préférable si vous pouvez gérer son déploiement sur les machines cibles.
Iain

Merci pour cette réponse. J'ai cherché haut et bas pour trouver un moyen de faire écho à la sortie colorée d'un fichier de commandes dans Powershell et c'était le seul. Je ne sais pas pourquoi il faut autant de temps pour l'imprimer (il y a comme une attente d'une seconde à chaque appel) mais au moins je peux le faire. Je vous remercie!
pizzafilms

29

Windows 10 - TH2 et supérieur:

(aka Version 1511, build 10586, version 2015-11-10)

À l'invite de commande:

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

Utilisation des touches réelles: écho Ctrl+ [[32m HI Ctrl+[[0mEnter

Vous devriez voir un "HI" vert en dessous.

Les numéros de code peuvent être trouvés ici:

Bloc-notes:

Pour l'enregistrer dans le bloc-notes, vous pouvez taper ESC dedans en utilisant: Alt+ 027avec le pavé numérique, puis la [32mpartie. Une autre astuce lorsque j'étais sur un ordinateur portable, redirigez la ligne ci-dessus dans un fichier pour commencer, puis coupez et collez:

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

3
Alt + 027 était exactement ce dont j'avais besoin!
Aleksander Stelmaczonek

1
Alt + 027 ne fonctionne pas dans Eclipse / Java .. également essayé \033mais non ... comment pourrais-je faire cela en Java?
derHugo

sur Windows 10 et supérieur, cela fonctionne dans l'éditeur DOS et Notepad ++. Merci!
Junior Mayhé

18

Vous pouvez simplement créer des fichiers avec le nom du mot à imprimer, utiliser findstr qui peut imprimer en couleur, puis effacer le fichier. Essayez cet exemple:

@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

Exécutez color /?pour obtenir une liste de couleurs.


3
Cela définit les couleurs dans la ligne de commande Windows. Pourriez-vous expliquer ce qu'il fait?
FeatureCreep

2
Ok, il crée simplement des fichiers avec le nom du mot à imprimer, utilise findstr qui peut imprimer en couleur, puis efface le fichier.
FeatureCreep

2
C'est impressionnant! Notez que les codes couleurs sont incorrects. Exécutez "couleur /?" pour voir les codes de couleur réels.
yoyo

3
Notez que findstr ne peut coloriser que le nom de fichier , ce qui signifie que vous ne pouvez pas utiliser cette astuce pour les chaînes qui contiennent des caractères de chemin d'accès illégaux.
yoyo

3
Notez également que cela écrasera les fichiers dans le même répertoire s'ils partagent le nom de ce que vous essayez d'imprimer ... ce n'est pas bon du tout.
BrainSlugs83

14

Vous pouvez utiliser ANSICON pour activer les codes de terminal ANSI dans les anciennes versions de Windows. Il existe des versions 32 et 64 bits que j'ai utilisées dans Windows XP et Windows 7.


Impossible de le faire fonctionner sur Windows 8.1. Plantage à chaque fois que j'essaie d'installer.
EHerman

@EHerman Peut - être que cette question vous aidera.
Bryan Ash

ANSICON n'est pas nécessaire dans les versions ultérieures de Win 10. N'essayez pas de l'utiliser ici.
Gringo Suave

6

J'étais ennuyé par le manque de coloration appropriée dans cmd aussi, alors j'ai continué et j'ai créé cmdcolor . C'est juste un proxy standard, qui recherche un ensemble limité de séquences de contrôle ANSI / VT100 (en d'autres termes, comme dans bash), c'est-à-dire echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Utilisation et téléchargements .


C'est cool, et je l'ai mis dans le système de menus d'un script de construction géant à mon travail. Le seul bœuf que j'ai, c'est que le binaire que vous fournissez sur cette page cible 64 bits, donc il ne fonctionnera pas sur notre machine de construction 32 bits. Mais ce n'était pas un problème de simplement saisir la source et de me compiler.
paddy

Mais c'est 32 bits :) Voici la sortie du fichier GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Alec Mev

C'est étrange ... XP Pro a refusé de l'exécuter, mais il fonctionnait bien sur ma boîte Win7 64. J'ai compilé avec Visual C ++, ciblant Win32, et ça allait.
paddy

Huh ... probablement à cause de upx. Pourriez-vous me contacter par e-mail, s'il vous plaît?
Alec Mev

6

J'ai regardé cela parce que je voulais introduire des couleurs de texte simples dans un fichier batch Win7. C'est ce que j'ai trouvé. Merci de votre aide.

@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

Il y a déjà une réponse acceptée avec plus de 250 votes positifs. La raison pour laquelle je continue de contribuer est que leescape caractère requis pour l'écho n'est pas accepté par de nombreux éditeurs (j'utilise, par exemple, MS Code) et toutes les autres solutions nécessitent des logiciels tiers (non par défaut de Windows).

La solution de contournement avec l'utilisation de commandes batch simples utilise PROMPTplutôt que ECHO. La PROMPTcommande accepte le escapecaractère d'une manière compatible avec n'importe quel éditeur en tant que $Eséquence de caractères. (Remplacez simplement le Escdans les codes d'échappement ASCII ) par $E.

Voici un code de démonstration:

@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

Remarque: le seul inconvénient est que cette technique entre en collision avec les paramètres de couleur cmd utilisateur ( colorcommande ou paramètres) si elle n'est pas connue explicitement.

- J'espère que cela aide car c'est la seule solution acceptable pour moi pour les raisons mentionnées au début. -

ÉDITER:

Sur la base des commentaires, je joins un autre extrait inspiré de @Jeb. Il:

  • Montre comment obtenir et utiliser le runtime de caractère "Esc" (plutôt que de le saisir dans un éditeur) (solution de Jeb)
  • Utilise des ECHOcommandes "natives"
  • Cela n'affecte donc pas la PROMPTvaleur locale
  • Démontre que la coloration de la ECHOsortie affecte inévitablement la PROMPTcouleur, de sorte que la couleur doit être réinitialisée de toute façon
@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

Technique très intéressante. Je verrai si j'ai besoin de mettre à jour github.com/VonC/batcolors avec. A voté.
VonC

@VonC Vous pouvez simplement créer une variable, contenant le chat d'échappement, sans avoir besoin de le saisir dans l'éditeur. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb

@jeb Voulez-vous dire "par opposition à echoutilisé dans batcolors / echo.bat "?
VonC

@VonC Oui, remplacez votre set ASCII27=←par for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". Cela utilise le caractère d'échappement créé par la commande d'invite, sans modifier définitivement l'invite (car la promptcommande est exécutée dans un processus enfant). Btw. Vous avez echos.batun certain potentiel d'optimisation ...
jeb

@jeb "Votre echos.bat a un certain potentiel d'optimisation": j'en suis sûr :) Les requêtes de tirage sont les bienvenues (à la fois pour l'ASCII27 et d'autres optimisations)
VonC

4

J'ajoute une réponse pour résoudre un problème noté dans certains commentaires ci-dessus: les codes de couleur ansi en ligne peuvent mal se comporter lorsqu'ils sont à l'intérieur d'une boucle FOR (en fait, dans n'importe quel bloc de code entre parenthèses). Le code .bat ci-dessous illustre (1) l'utilisation de codes de couleur en ligne, (2) l'échec de la couleur qui peut se produire lorsque des codes de couleur en ligne sont utilisés dans une boucle FOR ou dans un bloc de code entre parenthèses, et (3) une solution pour le problème. Lorsque le code .bat s'exécute, les tests 2 et 3 montrent l'échec du code couleur et le test 4 ne montre aucune défaillance car il implémente la solution.

[EDIT 2020-04-07: J'ai trouvé une autre solution qui est probablement plus efficace que d'appeler un sous-programme. Mettez la phrase FINDSTR entre parenthèses, comme dans la ligne suivante:

   echo success | (findstr /R success)

ENDEDIT]

Remarque: D'après mon expérience (limitée), le problème du code couleur ne se manifeste qu'après que l'entrée a été canalisée vers FINDSTR à l'intérieur du bloc de code. C'est ainsi que le .bat suivant reproduit le problème. Il est possible que le problème du code couleur soit plus général qu'après le raccordement à FINDSTR. Si quelqu'un peut expliquer la nature du problème et s'il existe une meilleure façon de le résoudre, je l'apprécierais.

@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

Je viens de passer de Win 7 Home à Win 10 Pro et je voulais remplacer le lot que j'appelle d'autres lots pour faire écho aux informations en couleur. En examinant ce qui est discuté ci-dessus, j'utilise ce qui suit qui remplacera directement mon lot précédent. REMARQUE l'ajout de "~" au message afin que les messages avec des espaces puissent être utilisés. Au lieu de me souvenir des codes, j'utilise des lettres pour les couleurs dont j'avais besoin.

Si% 2 contient des espaces, il faut "..."% 1 Couleurs fortes sur le noir: R = rouge G = VERT Y = JAUNE W = BLANC

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

Vous devrez faire écho à une séquence de code d'échappement ANSI pour modifier la couleur du texte: http://en.wikipedia.org/wiki/ANSI_escape_code

Une autre très bonne source de ces codes d'échappement est http://ascii-table.com/ansi-escape-sequences.php


Cela semble vraiment prometteur, mais comment puis-je émettre le caractère d'échappement - ASCII 27 dans une commande d'écho?
rui

10
La console Windows n'est pas un émulateur de terminal. Les séquences d'échappement ANSI ne peuvent tout simplement pas fonctionner. Vous pouvez inciter Windows 9x à le faire en chargeant ANSI.SYS mais nous avons un peu dépassé maintenant.
Joey

0

Mettez les lignes suivantes dans un fichier appelé ColourText.bassur votre bureau.

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

Enregistrez-le et tapez ce qui suit dans une invite de commandes.

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

Un fichier appelé ColourText.exe apparaîtra sur votre bureau. Déplacez-le dans le dossier Windows .

Pour l'utiliser, vous devez utiliser deux codes de caractères pour définir la couleur, par exemple 01pas 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Pour mettre du bleu sur blanc en ne passant aucun texte, puis du rouge sur du texte blanc, en terminant par du bleu sur gris.

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

La CLScommande devient également intéressante. ColorLa commande sans paramètres réinitialise toutes les couleurs aux couleurs de démarrage.

Pour obtenir le code couleur, additionnez les nombres suivants. Utilisez la calculatrice en mode programmeurs. Ce sont des nombres hexadécimaux. Ils peuvent être ajoutés ensemble, par exemple rouge + bleu + intensité FG = 13 = D. Comme 10+ n'a pas été utilisé, l'arrière-plan sera noir. Les codes de couleur DOIVENT être composés de deux caractères, par exemple 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
Bien qu'intéressant, tout le monde n'aura pas le SDK installé, en fait, très peu de gens, je pense.
Abel

0

Pour obtenir ce travail sur Windows 10, vous pouvez activer cette option: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

Avec cette clé de registre, vous pouvez définir cela par défaut

[HKCU\Console] VirtualTerminalLevel dword 0x1


0

Une alternative consiste à utiliser NodeJS .

Voici un exemple:

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

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

Et voici le résultat:

entrez la description de l'image ici


0

Comme Glenn Slayden l'a dit dans cette réponse , vous pouvez ajouter au registre la valeur appropriée pour rendre le cmd "plus coloré".

Heureusement, la valeur par défaut globale peut être modifiée de l'opt-in à l'opt-out. La clé de Registre dans HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel définit le comportement par défaut global pour le traitement des séquences d'échappement ANSI. Créez une clé DWORD (si nécessaire) et définissez sa valeur sur 1 pour activer globalement (ou 0 pour désactiver) le traitement ANSI par défaut.


0

Définir la couleur des instructions de journal dans PowerShell n'est pas un gros problème. vous pouvez utiliser le -ForegroundColorparamètre.

Pour écrire un message de confirmation.

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

Pour écrire un message d'erreur.

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

Pour écrire un message de progression .

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%est vide, donc cela ne fonctionnera pas. echo !white!définit la couleur sur blanc. Pour revenir aux couleurs par défaut (quels que soient les paramètres utilisateurs pour cela): la colorcommande sans paramètres le fait.
Stephan

-1

Nous le faisions avec les codes de terminal ANSI . Je ne sais pas s'ils fonctionnent toujours, mais vous pouvez les essayer.


1
Cela pourrait être une bonne réponse s'il expliquait comment utiliser ces codes de terminal ANSI ...
Davor Josipovic

1
Je pensais que l'article que j'avais lié l'expliquait. L'avez-vous lu? BTW: il dit qu'ils ne fonctionnent pas sur win32.
Michael J

En diagonale. L'article explique ce que sont les codes de terminal ANSI, mais pas vraiment comment les utiliser depuis cmd, donc pour répondre à la question. (Oui ... le fait que la console Win32 ne soit pas prise en charge les rend un peu hors de propos pour la question.)
Davor Josipovic

1
Vous feriez simplement écho des codes ANSI au terminal. Par exemple, "echo ← [6m" définirait la couleur du texte du terminal sur 6 (rouge). Remarque "←" est ASCII 27 (d'échappement). Vous pouvez le taper en maintenant «ALT» et en tapant «27» sur le pavé numérique. Je viens de le googler et j'ai découvert que vous pouvez toujours utiliser la commande "couleur" pour faire la même chose (bien que les codes numériques soient différents). "couleur 4" vous donne du texte rouge.
Michael J

-6

Vous pouvez utiliser la commande color pour changer la couleur de la console entière

Color 0F

Est en noir et blanc

Color 0A 

Est noir et vert


20
Bon à savoir. Malheureusement, cela change la couleur de toute la console et la question est de savoir comment changer une seule ligne (ou une partie de celle-ci) ..
Luke

6
L'OP a déclaré qu'il connaissait bien cette commande et que le problème était qu'elle modifiait toute la console et non une ligne spécifique.
Randall Flagg

5
Oui en effet pas vraiment réactif, mais c'est quand même utile de savoir.
CuriousMarc
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.