Как эхо с разными цветами в командной строке Windows

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

Ответ 1

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

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

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

Для версии ниже 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

Ответ 2

Это самоскомпилированный гибрид bat/.net (должен быть сохранен как .BAT), который можно использовать в любой системе с установленной средой .net (редко можно увидеть окна без платформы .NET даже для самой старой 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

Ответ 3

Это не очень хороший ответ, но если вы знаете, что на целевой рабочей станции есть 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
  • команда может также быть в основном использоваться "инлайн" вместо echo
    (вместо того, чтобы создавать отдельный пакетный файл, как указано выше).

Пример:

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

Дополнительная информация:

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

Ответ 4

Вы можете просто создавать файлы с именем слова для печати, использовать 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/? чтобы получить список цветов.

Ответ 5

Windows 10 - TH2 и выше:

(a.k.a. Версия 1511, сборка 10586, выпуск 2015-11-10)

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

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

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

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

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

Блокнот:

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Я посмотрел на это, потому что я хотел ввести простые текстовые цвета в пакетный файл 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

Ответ 10

Альтернативой является использование 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

Ответ 12

Поместите следующие строки в файл с именем ColourText.bas на рабочем столе.

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

Сохраните его и введите в командной строке следующее.

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

На рабочем столе появится файл ColourText.exe. Переместить его в папку Windows.

Для использования вы должны использовать два символьных кода для установки цвета, например 01 not 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

EG Чтобы установить синий цвет на белый, не передавая какой-либо текст, затем красным цветом на белом тексте, заканчивая синим цветом на сером.

ColourText F1 F1
ColourText F2 71 This is green on white

или

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

Также интересна команда CLS. Color команда без параметров сбрасывает все цвета в цвета запуска.

Чтобы получить код цвета, добавьте следующие числа вместе. Используйте калькулятор в режиме программистов. Это шестнадцатеричные числа. Они могут быть добавлены вместе, например, Red + Blue + FG Intensity = 13 = D. Поскольку 10+ не использовался, фон будет черным. Цветовые коды ДОЛЖНЫ быть двумя символами, например 08 not 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.

Ответ 13

Чтобы это работало в Windows 10, вы можете включить этот флаг: ENABLE_VIRTUAL_TERMINAL_PROCESSING.

С помощью этого раздела реестра вы можете установить это по умолчанию

[HKCU\Console] VirtualTerminalLevel dword 0x1

Ответ 14

Как сказал Гленн Слэйден в этом ответе, вы можете добавить в реестр правильное значение, чтобы сделать cmd "более красочным".

К счастью, глобальное значение по умолчанию может быть изменено с opt-in на opt-out. Раздел реестра в HKEY_CURRENT_USER\Console\VirtualTerminalLevel устанавливает глобальное поведение по умолчанию для обработки escape-последовательностей ANSI. Создайте ключ DWORD (при необходимости) и установите его значение равным 1, чтобы глобально включить (или 0, чтобы отключить ') обработку ANSI по умолчанию.

Ответ 15

Мы использовали это с кодами терминалов ANSI. Не уверен, что они все еще работают, но вы можете попробовать их.

Ответ 16

Вы можете использовать команду color, чтобы изменить цвет всей консоли

Color 0F

Черно-белый

Color 0A 

черный и зеленый