Как я могу изменить цвет текста в командной строке Windows - PullRequest
12 голосов
/ 17 сентября 2008

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

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

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

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

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

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

Ответы [ 14 ]

25 голосов
/ 17 сентября 2008

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

6 голосов
/ 17 сентября 2008

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

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

3 голосов
/ 17 сентября 2008

Вы можете прочитать здесь хорошую и иллюстрированную статью: 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 - это свойство для установки цвета текста.

2 голосов
/ 31 июля 2015

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

2 голосов
/ 17 сентября 2008

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

2 голосов
/ 17 сентября 2008

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

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

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

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

2 голосов
/ 17 сентября 2008

Вы можете использовать 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 для восстановления цвета по умолчанию.

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

Стандартная спецификация 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://msdn.microsoft.com/en-us/library/ms686047.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...