Як перегукуватись із різними кольорами у командному рядку Windows


217

Я знаю, що color bfкоманда встановлює кольори у всьому вікні командного рядка, але мені хотілося надрукувати один рядок іншим кольором.


1
Здавалося б, у мене немає простого способу додати втікаючі кольорові коди до командного рядка Windows. :(
rui

Руї, якщо Win10 є прийнятною версії операційної системи, перевірити відповідь Йенса - це повинно бути саме те , що вам потрібно, бачачи , як це питання не прийнято відповідь сім років тому: stackoverflow.com/a/38617204/3543437
kayleeFrye_onDeck

Відповіді:


284

Я хотів надрукувати один єдиний рядок іншим кольором.

Використовуйте послідовності втечі ANSI.

Windows до 10 - немає вбудованої підтримки кольорів ANSI на консолі

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

Windows 10 - Кольори командного рядка

Починаючи з Windows 10, консоль Windows за замовчуванням підтримує послідовності втечі ANSI та деякі кольори. Ця функція постачалася з оновленням 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- обидва повинні працювати. Але, я думаю, я знаю, чому це не працює: здається, що символ втечі видаляється під час публікації в StackOverflow. Будь ласка, не копіюйте вміст з моєї відповіді, використовуйте вміст звідси: gist.githubusercontent.com/mlocati/…
Єнс А. Кох

28
Мені ніколи не доводилося генерувати ESCблокнот ++ раніше ... Ви можете це зробити за допомогою ALT-кодів, використовуючи numpad та ліву клавішу ALT: L-ALT+ 0+ 2+7
kayleeFrye_onDeck

3
Btw, як людина, яка виготовляє та використовує багато партій протягом більшої кількості днів, ця відповідь покращила загальний набір інструментів в естетичному плані! Використовуючи VB? Чорт візьми, ні. Це шлях!
kayleeFrye_onDeck

4
Ви можете генерувати ESCперсонаж у пакетному файлі таким чином:for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
Aacini

56

Це самостійно складений гібрид bat / .net (має бути збережено як .BAT), який можна використовувати в будь-якій системі, на якій встановлено .net-фреймворк (рідкісна річ бачити вікна без .NET-рамки навіть для найстарішого XP / 2003 установок). Він використовує компілятор jscript.net для створення EXE, здатного друкувати рядки з іншим кольором фону / переднього плану лише для поточного рядка.

@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


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
  • команда також може в основному використовуватися " inline " замість echo
    (а не створювати окремий пакетний файл, як зазначено вище).

Приклад:

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

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

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



14
Витворіть, це працює для мене, але це занадто повільно.
wener

4
я розумію, що це відповідь, що забезпечує рішення, але повноваження? тьфу.
SgtPooki

2
Тому я почав із "Це не велика відповідь". Мені дуже подобається Powershell, але це непосильно для цього. ANSICON краще, якщо ви зможете впоратися з його розгортанням на цільових машинах.
Iain

Дякую за цю відповідь. Я виглядав високим і низьким способом відлучити кольоровий вихід із пакетного файлу в Powershell, і це був єдиний. Не впевнений, чому насправді потрібно надрукувати його так довго (як і 1 секунду очікування з кожним викликом), але принаймні я можу це зробити. Дякую!
pizzafilms

29

Windows 10 - TH2 і вище:

(він же версія 1511, збірка 10586, випуск 2015-11-10)

У командному рядку:

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

Використання фактичних клавіш: echo 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 ++. Дякую!
Молодший Мейхе

17

Ви можете просто створити файли з назвою слова для друку, використовуючи 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
Це вражає! Зауважте, що кольорові коди неправильні. Виконати "колір /?" щоб побачити фактичні коди кольорів.
yoyo

3
Зауважте, що findstr може розфарбувати лише ім'я файлу , а це означає, що ви не можете використовувати цей трюк для рядків, що містять незаконні символи шляху.
yoyo

3
Також зауважте, що це буде перезаписати файли в одному каталозі, якщо вони матимуть ім’я того, що ви намагаєтеся надрукувати ... це зовсім не добре.
BrainSlugs83

14

Ви можете використовувати ANSICON для включення термінальних кодів ANSI у старих версіях Windows. Є 32 та 64 бітні версії, які я використовував у Windows XP та Windows 7.


Неможливо змусити його працювати у Windows 8.1. Збій кожного разу, коли я намагаюся встановити.
EHerman

@EHerman Можливо, це питання допоможе.
Брайан Еш

ANSICON не потрібен у пізніших версіях Win 10. Не намагайтеся його використовувати там.
Gringo Suave

6

Мене дратувала відсутність належного фарбування в cmd, тому я пішов вперед і створив cmdcolor . Це просто stdout проксі, який шукає обмежений набір керуючих послідовностей ANSI / VT100 (іншими словами, як у bash), тобто 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
Alec Mev

Це дивно ... XP Pro відмовився запускати його, але він міг працювати на моєму вікні Win7 64. Я компілював з Visual C ++, орієнтуючись на Win32, і це було чудово.
рисовий

Так ... напевно, через upx. Чи можете ви зв’яжіться зі мною електронною поштою?
Алек Мев

6

Я подивився на це, бо хотів ввести кілька простих кольорів тексту у файл Win7 Batch. Це те, що я придумав. Спасибі за вашу допомогу.

@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 Escape ) на $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

ПРИМІТКА. Єдиним недоліком є ​​те, що ця методика стикається з налаштуваннями кольорових кольорів користувача ( 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

Дуже цікава техніка. Я побачу, чи потрібно мені оновлювати github.com/VonC/batcolors з ним. Оголошено.
VonC

@VonC Ви можете просто створити змінну, що містить схему евакуації, без необхідності вводити її в редактор. for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"
jeb

@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, без постійної зміни підказки (оскільки promptкоманда виконується в дочірньому процесі). Btw. Ви echos.batякий - то оптимізація потенціал ...
Джеб

@jeb "Ваш ехо.бат має певний потенціал оптимізації": я впевнений у цьому :) Запрошення про те, як запросити (як для ASCII27, так і для інших оптимізацій)
VonC

4

Я додаю відповідь, щоб вирішити проблему, зазначену в деяких коментарях вище: що вбудовані кольори ansi кольорів можуть погано поводитись, якщо знаходяться всередині циклу FOR (насправді, в будь-якому кодовому блоці коду). Нижній код .bat демонструє (1) використання вбудованих кольорових кодів, (2) кольоровий збій, який може виникнути, коли вбудовані коди кольорів використовуються в циклі FOR або в блокованому блоці коду, і (3) рішення для проблема. Коли код .bat виконується, тести 2 і 3 демонструють збій кольорового коду, а тест 4 показує відсутність збоїв, оскільки він реалізує рішення.

[EDIT 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

0

Вам потрібно буде повторити послідовність анімаційного коду ANSI, щоб змінити колір тексту: http://en.wikipedia.org/wiki/ANSI_escape_code

Ще одне дуже хороше джерело цих кодів евакуації - http://ascii-table.com/ansi-escape-sequences.php


Це виглядає по-справжньому багатообіцяючо, але як я випускаю символ Escape - ASCII 27 у команді ехо?
rui

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

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команда без параметрів скидає всі кольори для запуску кольорів.

Щоб отримати колірний код, додайте наступні цифри разом. Використовуйте калькулятор в режимі програмістів. Це шістнадцяткові числа. Їх можна додавати, наприклад, червоний + синій + інтенсивність FG = 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.

2
Хоча цікаво, не у всіх буде встановлений 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());

І ось результат:

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


0

Як сказав Гленн Слейден у цій відповіді , ви можете додати до реєстру належне значення, щоб зробити cmd "більш кольоровим".

На щастя, глобальний стандарт за замовчуванням може бути змінений з відмови на відмову. Ключ реєстру на HKEY_CURRENT_USER \ Console \ VirtualTerminalLevel встановлює глобальну поведінку за замовчуванням для обробки послідовностей аварійного відбору ANSI. Створіть ключ DWORD (при необхідності) і встановіть його значення 1, щоб глобально включити (або 0 відключити ") обробку ANSI за замовчуванням.


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

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
Я подумав, що статтю, з якою я пов'язав, пояснив це. Ви це читали? BTW: там сказано, що вони не працюють на win32.
Майкл Дж.

По діагоналі. У статті пояснено, що таке термінальні коди ANSI, але насправді, як їх використовувати зсередини cmd, щоб відповісти на питання. (Так ... той факт, що консоль Win32 не підтримується, робить їх дещо неактуальними для питання.)
Давор Йосипович,

1
Ви просто переймете ANSI-коди до терміналу. наприклад, "echo ← [6m" встановив би колір тексту терміналу 6 (червоний). Примітка "←" - це ASCII 27 (втеча). Ви можете ввести його, натиснувши "ALT" і набравши "27" на цифровій клавіатурі. Я просто погукнув його і дізнався, що ви можете використовувати команду "color", щоб зробити те ж саме (хоча числові коди різні). "Колір 4" отримує червоний текст.
Майкл Дж

-6

Ви можете використовувати команду color, щоб змінити колір всієї консолі

Color 0F

Чорно-біла

Color 0A 

Чорний і зелений


20
Добре знати. На жаль, це змінює колір усієї консолі, і питання полягає в тому, як змінити окремий рядок (або його частину) ..
Лука

6
ОП заявив, що він знайомий з цією командою і що проблема полягає в тому, що вона змінює всю консоль, а не конкретний рядок.
Рандалл Флагг

5
Так, справді не чуйний, але це все-таки корисно знати.
CuriousMarc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.