web-dev-qa-db-fra.com

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

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

150
rui

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 soit Cmder , ConEmu , ANSICON ou Mintty (utilisé par défaut dans GitBash et Cygwin) pour ajouter le support de coloration à votre console de commande Windows.

Windows 10 - Couleurs de la 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é livrée avec la mise à jour Threshold 2 en novembre 2015.

Documentation MSDN

Démo

 enter image description here

Commande par lot

Le win10colors.cmd a é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
180
Jens A. Koch

Ceci est un bat/.net hybride auto-compilé (devrait être enregistré sous le nom .BAT) et peut être utilisé sur tout système ayant installé le framework .net (il est rare de voir une fenêtre sans le framework .NET même pour les plus anciennes installations XP/2003). Il utilise le compilateur jscript.net pour créer un fichier exe capable d’imprimer des chaînes avec une couleur de fond/premier plan différente pour la ligne en cours uniquement.

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

 enter image description here

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

46
npocmaka

Ce n'est pas une bonne réponse, mais si vous connaissez le poste de travail cible doté de Powershell, vous pouvez procéder de la sorte (comme dans le cas du script BAT/CMD):

CALL:ECHORED "Print me in red!"

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

Modifier: (maintenant plus simple!)

C'est une vieille réponse mais je me suis dit que je clarifierais et simplifierais un peu

img

PowerShell est maintenant inclus dans toutes les versions de Windows depuis 7. La syntaxe de cette réponse peut donc être réduite à un formulaire plus simple:

  • le chemin n'a pas besoin d'être spécifié puisqu'il devrait déjà être dans la variable d'environnement.
  • univiguous les commandes peuvent être abrégées . Par exemple, vous pouvez:
    • utilisez -fore au lieu de -foregroundcolor
    • utilisez -back au lieu de -backgroundcolor
  • la commande peut aussi être utilisée 'inline' à la place de echo
    (plutôt que de créer un fichier batch 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 est disponible dans le
- PowerShell Documentation pour Write-Host

34
Iain

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.

17
Tutankhamen

Vous pouvez utiliser ANSICON pour activer les codes de terminal ANSI dans Windows moderne. J'ai utilisé des versions 32 et 64 bits sous Windows XP et Windows 7.

13
Bryan Ash

Windows 10 - TH2 et supérieur:

À l'invite de commande:

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

Utilisation des touches réelles: echo Ctrl+[[32m HICtrl+[[0mEnter

Vous devriez voir un "HI" vert en dessous.

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

Bloc-notes:

Pour enregistrer ceci dans le bloc-notes, vous pouvez taper ESC en utilisant: Alt+027 avec le pavé numérique, puis la partie [32m. 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
11
Gringo Suave

Le manque de couleurs appropriées dans cmd m'a également agacé, alors je suis allé de l'avant et j'ai créé cmdcolor. Il s’agit d’un proxy stdout 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 .

6
Olegs Jeremejevs

J'ai regardé cela parce que je voulais introduire des couleurs de texte simples dans un fichier batch Win7. C'est ce que je suis venu avec. 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
Nick-n-Chicago

vous pouvez utiliser cecho .. vous pouvez également l'utiliser pour l'intégrer directement dans votre script afin de ne pas avoir à emporter un fichier .com ou .exe

http://www.codeproject.com/Articles/17033/Add-Colors-to-Batch-Files

1
Brian Gleason

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:

 enter image description here

0
Josem

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

0
Bernhard Hofmann

Placez les lignes suivantes dans un fichier appelé ColourText.bas sur 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 commande.

"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 utiliser, vous devez utiliser deux codes de caractères pour définir la couleur, par exemple 01 et non 1

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Pour définir le bleu sur le blanc en ne passant aucun texte, puis le rouge sur le texte blanc, en terminant par le bleu sur le 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 commande CLS devient également intéressante. La commande Color sans paramètre réinitialise toutes les couleurs en couleurs de démarrage.

Pour obtenir le code de couleur, additionnez les nombres suivants. Utilisez la calculatrice en mode programmeur. Ce sont des nombres hexadécimaux. Ils peuvent être additionnés, par exemple Intensité Rouge + Bleu + FG = 13 = D. Comme 10+ n’a pas été utilisé, l’arrière-plan sera noir. Les codes de couleur DOIVENT contenir deux caractères, par exemple 08 et non 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.
0
user6017774

Pour que cela fonctionne sous Windows 10, vous pouvez activer cet indicateur: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

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

[HKCU\Console] VirtualTerminalLevel dword 0x1

0
Michel de Groot

Comme Glenn Slayden a déclaré 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 opt-in à opt-out. La clé de registre sous HKEY_CURRENT_USER\Console\VirtualTerminalLevel définit le comportement par défaut global du 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
hawk1337