Как отображать разные цвета в командной строке Windows - PullRequest
168 голосов
/ 12 января 2010

Я знаю, что команда color bf устанавливает цвета всего окна командной строки, но я хотел напечатать одну строку другим цветом.

Ответы [ 16 ]

213 голосов
/ 27 июля 2016

Я хотел напечатать одну строку другим цветом.

Используйте ANSI Escape-последовательности.

Windows до 10 - нет встроенной поддержки цветов ANSI на консоли

Для версии Windows ниже 10 командная консоль Windows не поддерживает раскраску вывода по умолчанию. Вы можете установить Cmder , ConEmu , ANSICON или Mintty (используется по умолчанию в GitBash и Cygwin), чтобы добавить поддержку окраски в ваш Командная консоль Windows.

Windows 10 - Цвета командной строки

Начиная с Windows 10, консоль Windows поддерживает ANSI Escape-последовательности и некоторые цвета по умолчанию. Функция поставляется с обновлением Threshold 2 в ноябре 2015 года.

Документация MSDN

Обновление (05-2019): ColorTool позволяет изменять цветовую схему консоли. Это часть проекта Microsoft Terminal .

Демо

enter image description here

Пакетная команда

win10colors.cmd было написано Микеле Локати :

@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
49 голосов
/ 31 января 2015

Это скомпилированный bat / .net hybrid (должен быть сохранен как .BAT), который можно использовать в любой системе, в которой установлен. Windows без .NET Framework даже для самых старых установок XP / 2003). Он использует компилятор jscript.net для создания исполняемого файла, способного печатать строки с другим цветом фона / переднего плана только для текущей строки.

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

Вот справочное сообщение:

enter image description here

Пример

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

Вы также можете найти этот скрипт здесь .

Вы также можете проверить цветовую функцию Карлоса -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453

40 голосов
/ 04 августа 2011

Это не очень хороший ответ, но если вы знаете, что на целевой рабочей станции есть Powershell, вы можете сделать что-то вроде этого (при условии сценария BAT / CMD):

CALL:ECHORED "Print me in red!"

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

Редактировать: (теперь проще!)

Это старый ответ, но я решил немного уточнить и упростить

img

PowerShell теперь включен во всех версиях Windows начиная с 7. Поэтому синтаксис этого ответа можно сократить до более простой формы:

  • путь указывать не нужно, поскольку он уже должен быть в переменной окружения.
  • однозначные команды могут быть сокращенно . Например, вы можете:
    • используйте -fore вместо -foregroundcolor
    • используйте -back вместо -backgroundcolor
  • Команду также можно использовать как ' inline ' вместо echo
    (вместо создания отдельного командного файла, как указано выше).

Пример: * * тысяча пятьдесят-три powershell write-host -fore Cyan This is Cyan text powershell write-host -back Red This is Red background Дополнительная информация:

Полный список цветов и дополнительная информация доступна в
- PowerShell Документация для Write-Host

17 голосов
/ 15 апреля 2014

Вы можете просто создать файлы с именем слова для печати, использовать findstr, который может печатать в цвете, а затем удалить файл. Попробуйте этот пример:

@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

Запустите color /?, чтобы получить список цветов.

13 голосов
/ 19 января 2012

Вы можете использовать ANSICON для включения кодов терминала ANSI в современной Windows. Есть 32- и 64-разрядные версии, которые я использовал в Windows XP и Windows 7.

12 голосов
/ 05 октября 2018

Windows 10 - TH2 и выше:

В командной строке:

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

Использование актуальных клавиш: echo Ctrl + [[32m HI Ctrl + [[0m Введите

Вы должны увидеть зеленое "HI" под ним.

Кодовые номера можно найти здесь:

Блокнот:

Чтобы сохранить это в блокноте, вы можете ввести в него ESC, используя: Alt +027 с цифровой клавиатурой, затем часть [32m. Еще одна хитрость, когда я был на ноутбуке, перенаправьте строку выше в файл, чтобы начать, затем вырезайте и вставляйте:

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
6 голосов
/ 13 февраля 2014

Меня тоже раздражало отсутствие правильной окраски в cmd, поэтому я решил создать cmdcolor . Это просто прокси-сервер stdout, который ищет ограниченный набор управляющих последовательностей ANSI / VT100 (другими словами, как в bash), т.е. echo \033[31m RED \033[0m DEFAULT | cmdcolor.exe.

Использование и загрузка .

5 голосов
/ 09 февраля 2015

Я посмотрел на это, потому что хотел ввести несколько простых цветов текста в пакетный файл Win7. Это то, что я придумал. Спасибо за вашу помощь.

@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
1 голос
/ 11 февраля 2019

Альтернативой является использование NodeJS .

Вот пример:

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

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

И вот результат:

enter image description here

1 голос
/ 01 июня 2010

вы можете использовать cecho .. вы также можете использовать его для встраивания прямо в ваш скрипт, так что вам не нужно носить с собой .com или .exe

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

...