Как отображать разные цвета в командной строке Windows

217

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

Руи
источник
1
Казалось бы, у меня нет простого способа добавить экранированные цветовые коды в командную строку Windows. :(
Руи
rui, если Win10 является приемлемой версией ОС, проверьте ответ Йенса - он должен быть именно тем, что вам нужно, поскольку этот вопрос никогда не принимал ответ семь лет назад: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck
1
Возможный дубликат Как иметь несколько цветов в командном файле Windows?
Миха Виденманн

Ответы:

285

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

Используйте 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 .

демонстрация

введите описание изображения здесь

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

Это 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
Йенс А. Кох
источник
11
@Jens A. Koch - он не работает в моей консоли windows 10 (cmd)
user3057544
40
Хорошо. Спасибо за ответ. .cmdили .bat- оба должны работать. Но, я думаю, я знаю, почему это не работает: кажется, что символ escape удаляется при публикации в StackOverflow. Пожалуйста, не копируйте содержание из моего ответа, используйте его здесь: gist.githubusercontent.com/mlocati/…
Йенс А. Кох
28
ESCРаньше мне никогда не приходилось генерировать в notepad ++ ... Это можно сделать с помощью ALT-кодов, используя цифровую клавиатуру и левую клавишу ALT: L-ALT+ 0+ 2+7
kayleeFrye_onDeck
3
Кстати, как тот, кто делает и использует много партий в большинстве дней, этот ответ эстетически улучшил мой общий набор инструментов! Используя VB? Конечно нет. Это путь!
kayleeFrye_onDeck
5
Вы можете сгенерировать ESCперсонажа в for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
командном
56

Это самоскомпилированный гибрид 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;

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

введите описание изображения здесь

Пример :

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

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

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

npocmaka
источник
13
Как это круто. Файл bat, который компилирует jscript, который находится в нем, и только если это необходимо - я очень впечатлен. Даже не знал, что там сидит компилятор jscript, ожидающий использования. Ты получаешь мою "потрясающую награду" за месяц. Вы должны упомянуть, что первое использование будет медленным (из-за компиляции).
Грэм
4
Мне не нужен цвет достаточно сильно, чтобы довести это до крайности, но техника действительно впечатляет, и я вижу, как использую ее в другом месте.
EM0
47

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

Пример:

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

Больше информации:

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

Iain
источник
15
Великий, это работает для меня, но это слишком медленно.
Wener
4
я понимаю, что это ответ, предоставляющий решение, но powershell? тьфу.
SgtPooki
2
Вот почему я начал с «Это не очень хороший ответ». Мне очень нравится Powershell, но это излишне для этого. ANSICON лучше, если вы справитесь с его развертыванием на целевых машинах.
Иэн
Спасибо за этот ответ. Я искал высоко и низко способ отображения цветного вывода из пакетного файла в Powershell, и это был единственный способ. Не уверен, почему на самом деле это так долго печатается (это примерно 1 секунда ожидания при каждом вызове), но по крайней мере я могу это сделать. Спасибо!
pizzafilms
29

Windows 10 - TH2 и выше:

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

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

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

Используя фактические ключи: эхо Ctrl+ [[32m HI Ctrl+[[0mEnter

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

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

Блокнот:

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

echo echo ^[[32m HI ^[[0m >> batch_file.cmd
Гринго Суаве
источник
3
Alt + 027 было именно то, что мне было нужно!
Александр Стельмачонек,
1
Alt + 027 не работает в Eclipse / Java .. также пытался, \033но нет ... как я могу сделать это в Java?
derHugo
на Windows 10 и выше, это работает в редакторе DOS и Notepad ++. Спасибо!
Младший Mayhé
18

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

Тутанхамон
источник
3
Это устанавливает цвета в командной строке Windows. Не могли бы вы объяснить, что он делает?
FeatureCreep
2
Хорошо, он просто создает файлы с именем слова для печати, использует findstr, который может печатать в цвете, а затем стирает файл.
FeatureCreep
2
Это впечатляет! Обратите внимание, что цветовые коды неверны. Запустите "цвет /?" чтобы увидеть актуальные цветовые коды.
Йо
3
Обратите внимание, что findstr может только окрасить имя файла , что означает, что вы не можете использовать этот трюк для строк, которые содержат недопустимые символы пути.
Йо
3
Также следует отметить, что это перезапишет файлы в том же каталоге, если они разделяют имя того, что вы пытаетесь напечатать ... это совсем не хорошо.
BrainSlugs83
14

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

Брайан Эш
источник
Не могу заставить его работать на Windows 8.1. Сбой каждый раз, когда я пытаюсь установить.
Ехерман
@EHerman Может быть, этот вопрос поможет.
Брайан Эш
ANSICON не требуется в более поздних версиях Win 10. Не пытайтесь использовать его там.
Гринго Суаве
6

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

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

Алек Мев
источник
Это круто, и я включил это в систему меню гигантского сценария сборки на моей работе. Единственное, что у меня есть, так это то, что двоичный файл, который вы предоставляете на этой странице, предназначен для 64-битной системы, поэтому он не будет работать на нашей 32-битной сборочной машине. Но это не проблема, просто взять исходный код и собрать себя.
Пэдди
Но это 32-битный :) Вот вывод файла GNU:cmdcolor.exe; PE32 executable for MS Windows (console) Intel 80386 32-bit
Алек Мев
Странно ... XP Pro отказался запускать его, но он отлично работал на моем Win7 64 box. Я скомпилировал с Visual C ++, ориентируясь на Win32, и это было хорошо.
Пэдди
Хм ... наверное из-за upx. Не могли бы вы связаться со мной по электронной почте, пожалуйста?
Алек Мев,
6

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

Есть уже принятый ответ с более чем 250 голосами против. Причина, по которой я все еще помогаю, заключается в том, что escapeсимвол, необходимый для отображения, не принимается многими редакторами (я использую, например, MS Code), а для всех других решений требуются сторонние (не по умолчанию Windows) части программного обеспечения.

Обходной путь с использованием только простых командных команд используется PROMPTвместо ECHO. Команда PROMPTпринимает escapeсимвол любым удобным для редактора способом как $Eпоследовательность символов. (Просто замените Escв кодах ASCII Спасения ) с $E.

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

@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

ПРИМЕЧАНИЕ. Единственным недостатком является то, что этот метод вступает в противоречие с пользовательскими настройками цвета cmd ( colorкоманда или настройки), если они не известны явно.

- Надеюсь, это поможет, так как это единственное решение, приемлемое для меня по причинам, упомянутым в начале. -

РЕДАКТИРОВАТЬ:

Основываясь на комментариях, я прилагаю еще один фрагмент, вдохновленный @Jeb. Это:

  • Показывает, как получить и использовать среду выполнения символа «Esc» (а не вводить ее в редактор) (решение Джеба)
  • Использует "родную" ECHOкоманду (ы)
  • Так что это не влияет на местное PROMPTзначение
  • Демонстрирует, что окрашивание ECHOвывода неизбежно влияет на PROMPTцвет, поэтому в любом случае цвет должен быть сброшен
@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
PavDub
источник
Очень интересная техника. Я посмотрю, нужно ли мне обновить github.com/VonC/batcolors . Upvoted.
VonC
@VonC Вы можете просто создать переменную, содержащую escape-chatacter, без необходимости вводить ее в редактор. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
Джеб
@jeb Вы имеете в виду "в отличие от echoиспользуемого в batcolors / echo.bat "?
VonC
@VonC Да заменяйте set ASCII27=←с for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "ASCII27=%%E". При этом используется управляющий символ, созданный командой приглашения, без постоянного изменения приглашения (поскольку promptкоманда выполняется в дочернем процессе). Btw. У вас echos.batесть некоторый потенциал оптимизации ...
Джеб
@jeb "У вашего echos.bat есть потенциал для оптимизации": я уверен в этом :) Запросы на извлечение приветствуются (как для ASCII27, так и для других оптимизаций)
VonC
4

Я добавляю ответ для решения проблемы, отмеченной в некоторых комментариях выше: встроенные цветовые коды ANSI могут вести себя некорректно, когда находятся внутри цикла FOR (фактически, внутри любого блока кода, заключенного в скобки). Приведенный ниже код .bat демонстрирует (1) использование встроенных цветовых кодов, (2) сбой цвета, который может возникнуть, когда встроенные цветовые коды используются в цикле FOR или внутри блока кода, заключенного в скобки, и (3) решение эта проблема. Когда исполняется код .bat, тесты 2 и 3 демонстрируют сбой цветового кода, а тест 4 - отсутствие сбоя, поскольку он реализует решение.

[РЕДАКТИРОВАТЬ 2020-04-07: Я нашел другое решение, которое предположительно более эффективно, чем вызов подпрограммы. Заключите фразу FINDSTR в скобки, как показано в следующей строке:

   echo success | (findstr /R success)

EndEdit]

Примечание. По моему (ограниченному) опыту, проблема с цветовым кодом проявляется только после того, как ввод передается в FINDSTR внутри блока кода. Вот как следующий .bat воспроизводит проблему. Возможно, проблема цветового кода является более общей, чем после передачи в FINDSTR. Если кто-то может объяснить природу проблемы, и если есть лучший способ ее решить, я был бы признателен.

@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

Я только что перешел из Win 7 Home в Win 10 Pro и хотел заменить пакет, который я вызываю, из других пакетов, чтобы отображать информацию в цвете. Рассматривая то, что обсуждалось выше, я использую следующее, которое напрямую заменит мою предыдущую партию. ОБРАТИТЕ ВНИМАНИЕ добавление «~» к сообщению, чтобы можно было использовать сообщения с пробелами. Вместо того, чтобы запоминать коды, я использую буквы для нужных мне цветов.

Если% 2 содержит пробелы, требуется "..."% 1 Сильные цвета на черном: R = Красный G = ЗЕЛЕНЫЙ Y = ЖЕЛТЫЙ W = БЕЛЫЙ

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
ebloch
источник
0

Чтобы изменить цвет текста, вам нужно будет отобразить последовательность escape-кода ANSI: http://en.wikipedia.org/wiki/ANSI_escape_code

Еще один очень хороший источник этих escape-кодов - http://ascii-table.com/ansi-escape-septions.php

Бернхард Хофманн
источник
Это выглядит действительно многообещающе, но как мне использовать символ Escape - ASCII 27 в команде echo?
Руи
10
Консоль Windows не является эмулятором терминала. Экранирующие последовательности ANSI просто не могут работать. Вы можете заставить Windows 9x сделать это, загрузив ANSI.SYS, но мы уже немного отошли от этого.
Джои
0

Поместите следующие строки в файл с именем 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нет 1.

ColourText ColourOfText ColourOfTextWhenFinished Text

Например, чтобы установить синий на белый, не пропуская текст, затем красный на белый текст, заканчивая синим на сером.

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нет 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
Интересно, что не у всех будет установлен SDK, на самом деле, я думаю, очень мало людей.
Авель
0

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

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

[HKCU\Console] VirtualTerminalLevel dword 0x1

Мишель де Гроот
источник
0

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

Вот пример:

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

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

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

введите описание изображения здесь

Josem
источник
0

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

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

torswq
источник
0

Установка цвета для операторов журнала в powershell не имеет большого значения, друг. Вы можете использовать -ForegroundColorпараметр.

Написать подтверждающее сообщение.

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

Написать сообщение об ошибке.

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

Написать сообщение о прогрессе .

Write-Host "Working under pocess..." -ForegroundColor Green
Bug_
источник
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%пусто, так что это не сработает. echo !white!устанавливает цвет на белый. Чтобы вернуться к цветам по умолчанию (какими бы ни были настройки пользователя): это colorделает команда без параметров.
Стефан
-1

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

Майкл Дж
источник
1
Это могло бы быть хорошим ответом, если бы в нем объяснялось, как использовать эти терминальные коды ANSI ...
Давор Йосипович,
1
Я думал, что статья, на которую я ссылался, объяснила это Вы читали это? Кстати: там написано, что они не работают на win32.
Майкл Джей
Диагонально. В статье объясняется, что такое терминальные коды ANSI, но не совсем, как их использовать из cmd, поэтому ответим на вопрос. (Да ... тот факт, что консоль Win32 не поддерживается, делает их немного неуместными в этом вопросе.)
Davor Josipovic
1
Вы бы просто повторили коды ANSI на терминал. например, "echo ← [6m" установит цвет текста терминала на 6 (красный). Примечание «←» - ASCII 27 (escape). Вы можете набрать его, удерживая нажатой клавишу «ALT» и набрав «27» на цифровой клавиатуре. Я просто погуглил и обнаружил, что вы все еще можете использовать команду «color», чтобы сделать то же самое (хотя числовые коды разные). «цвет 4» получает красный текст.
Майкл Дж
-6

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

Color 0F

Черный и белый

Color 0A 

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

дан тауро
источник
20
Приятно знать. К сожалению, это меняет цвет всей консоли, и вопрос в том, как изменить одну строку (или ее часть) ..
Лука
6
ОП заявил, что он знаком с этой командой и проблема в том, что она меняет всю консоль, а не конкретную строку.
Рэндалл Флэгг
5
Да, действительно не очень отзывчивый, но это все еще полезно знать.
CuriousMarc