Как я могу изменить цвет текста в командной строке Windows

У меня есть программа командной строки, которая выводит логирование на экран.

Я хочу, чтобы строки ошибок отображались красным цветом. Могу ли я вывести некоторые специальные коды символов, чтобы переключить цвет текста на красный, а затем снова переключить его на белый?

Я использую рубин, но я думаю, что это будет то же самое на любом другом языке.

Что-то вроде:

red = "\0123" # character code
white = "\0223"

print "#{red} ERROR: IT BROKE #{white}"
print "other stuff"

14 ответов

Решение

Вам необходимо получить доступ к [Win32 Console API] ( http://msdn.microsoft.com/en-us/library/ms682073(VS.85%29.aspx). К сожалению, я не знаю, как вы это сделаете это из Ruby. В Perl я бы использовал модуль Win32:: Console. Консоль Windows не отвечает на управляющие коды ANSI.

Согласно статье о раскрашивании вывода Ruby, упомянутой artur02, вам нужно установить и загрузить гем win32console.

В Windows вы можете сделать это легко тремя способами:

require 'win32console'
puts "\e[31mHello, World!\e[0m"

Теперь вы можете расширить String с помощью небольшого метода red

 require 'win32console'
 class String
   def red
     "\e[31m#{self}\e[0m"
   end
 end

 puts "Hello, World!".red

Также вы можете расширить строку таким образом, чтобы получить больше цветов:

require 'win32console'

class String
  { :reset          =>  0,
    :bold           =>  1,
    :dark           =>  2,
    :underline      =>  4,
    :blink          =>  5,
    :negative       =>  7,
    :black          => 30,
    :red            => 31,
    :green          => 32,
    :yellow         => 33,
    :blue           => 34,
    :magenta        => 35,
    :cyan           => 36,
    :white          => 37,
  }.each do |key, value|
    define_method key do
      "\e[#{value}m" + self + "\e[0m"
    end
  end
end

puts "Hello, World!".red

Или, если вы можете установить драгоценные камни:

gem install term-ansicolor

И в вашей программе:

require 'win32console'
require 'term/ansicolor'

class String
  include Term::ANSIColor
end

puts "Hello, World!".red
puts "Hello, World!".blue
puts "Annoy me!".blink.yellow.bold

Пожалуйста, смотрите документацию по термину /ansicolor для получения дополнительной информации и возможного использования.

Вы можете прочитать здесь хорошую и иллюстрированную статью: http://kpumuk.info/ruby-on-rails/colorizing-console-ruby-script-output/

Я думаю, что настройка цвета текста консоли зависит от языка. Вот пример в C# от MSDN:

for (int x = 0; x < colorNames.Length; x++)
{
  Console.Write("{0,2}: ", x);
  Console.BackgroundColor = ConsoleColor.Black;
  Console.ForegroundColor = (ConsoleColor)Enum.Parse(typeof(ConsoleColor), colorNames[x]);
  Console.Write("This is foreground color {0}.", colorNames[x]);
  Console.ResetColor();
  Console.WriteLine();
}

Console.ForegroundColor - это свойство для установки цвета текста.

color [background][foreground]

Где цвета определяются следующим образом:

0 = Black    8 = Gray
1 = Blue     9 = Light Blue
2 = Green    A = Light Green
3 = Aqua     B = Light Aqua
4 = Red      C = Light Red
5 = Purple   D = Light Purple
6 = Yellow   E = Light Yellow
7 = White    F = Bright White

Например, чтобы изменить фон на синий, а на передний план - серый, введите:

color 18

По кодам выхода ANSI:

32-битный символьный режим (подсистема: консоль) Приложения Windows не записывают escape-последовательности ANSI на консоль

Они должны интерпретировать действия escape-кода и вместо этого вызывать собственный API-интерфейс консоли.

Спасибо майкрософт:-(

Вы можете использовать escape-последовательность ANSI, но это не будет делать то, что вы хотите в современных версиях Windows. В Википедии есть очень информативная статья:

http://en.wikipedia.org/wiki/ANSI_escape_code

Таким образом, ответ на ваш первоначальный вопрос почти наверняка "нет". Однако вы можете изменить цвет переднего плана без написания escape-последовательности, например, вызвав функцию Win32 API. Я не знаю, как сделать что-то подобное в Ruby до предела, но, кажется, кому-то другому удалось:

http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/241925

Я полагаю, вы хотите использовать 4 для темно-красного или 12 для ярко-красного и 7 для восстановления цвета по умолчанию.

Надеюсь это поможет!

Я создал небольшой кроссплатформенный гем, который легко справляется с этим на Windows или POSIX-системах под управлением MRI и JRuby.

Он не имеет зависимостей и использует коды ANSI в системах POSIX, а также FFI (JRuby) или Fiddler (MRI) для Windows.

Чтобы использовать это, просто:

gem install color-console

ColorConsole предоставляет методы для вывода строк текста различными цветами, используя функции Console.write и Console.puts.

require 'color-console'

Console.puts "Some text"                    # Outputs text using the current  console colours
Console.puts "Some other text", :red        # Outputs red text with the current background
Console.puts "Yet more text", nil, :blue    # Outputs text using the current foreground and a blue background

# The following lines output BlueRedGreen on a single line, each word in the appropriate color
Console.write "Blue ", :blue
Console.write "Red ", :red
Console.write "Green", :green

Посетите домашнюю страницу проекта по адресу https://github.com/agardiner/color-console для получения более подробной информации.

Стандартная спецификация C/C++ для вывода в командную строку не определяет никаких возможностей для изменения цвета окна консоли. Тем не менее, в Win32 есть много функций для таких вещей.

Самый простой способ изменить цвет консоли Win32 - воспользоваться системной командой в iostream.h. Эта функция вызывает команду DOS. Чтобы изменить цвета, мы будем использовать его для вызова команды цвета. Например, system("Color F1"); сделает консоль темно-синей на белом.

DOS Colours

Доступные для использования с командой цвета - это шестнадцать цветов DOS, каждый из которых представлен шестнадцатеричной цифрой. Первый - фон, а второй - передний план.

0 = Black    8 = Gray
1 = Blue     9 = Light Blue
2 = Green    A = Light Green
3 = Aqua     B = Light Aqua
4 = Red      C = Light Red
5 = Purple   D = Light Purple
6 = Yellow   E = Light Yellow
7 = White    F = Bright White

Просто это небольшое прикосновение цвета делает консольные программы более привлекательными. Однако команда Color изменит цвет всей консоли. Для управления отдельными ячейками нам нужно использовать функции из windows.h.

Сделайте то, что вам нужно использовать SetConsoleAttribute функция

http://http//msdn.microsoft.com/en-us/library/ms686047.aspx

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Console_Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.DarkRed;
            Console.WriteLine("Hello World");
            Console.ReadKey();
        }
    }
}

Вы можете изменить цвет, используя простую программу на C#, http://powerof2games.com/node/31 описывает, как можно обернуть вывод консоли для достижения эффекта.

Насколько я знаю, это невозможно с помощью командной строки, это всего лишь один цвет...

Вы хотите коды выхода ANSI.

Многие старые цветовые коды ANSI работают. Код для красного переднего плана - это что-то вроде Escape-[31m. Escape - это символ 27, так что это "\033[31m" или "\x1B[31m", в зависимости от вашей схемы побега.

[39m - это код для возврата к цвету по умолчанию.

Также можно указать несколько кодов одновременно, чтобы установить цвет переднего плана и фона одновременно.

Возможно, вам придется загрузить ANSI.sys, см. Эту страницу.

В конечном итоге вам нужно вызвать SetConsoleTextAttribute. Вы можете получить дескриптор буфера экрана консоли от GetStdHandle.

Я давно использую бесплатную оконную программу для Windows, называемую baretail (google it), которая позволяет вам использовать версию команды unix tail для Windows. Это позволяет вам раскрашивать строки в зависимости от того, какие ключевые слова вы определили. Что приятно в этом решении, так это в том, что оно не привязано к конкретному языку или настройке и т. Д., Вы просто определяете свою цветовую схему и ее настройку, как осла-конга. В моем личном топ-10 бесплатных помощников!

Другие вопросы по тегам