Pergunta

Eu tenho um programa de linha de comando, que gera o log na tela.

Quero que as linhas de erro apareçam em vermelho.Existem alguns códigos de caracteres especiais que posso gerar para mudar a cor do texto para vermelho e depois voltar para branco?

Estou usando Ruby, mas imagino que seria o mesmo em qualquer outra linguagem.

Algo como:

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

print "#{red} ERROR: IT BROKE #{white}"
print "other stuff"
Foi útil?

Solução

Você precisa acessar a [API do console Win32](http://msdn.microsoft.com/en-us/library/ms682073(VS.85%29.aspx).Infelizmente, não sei como você faria isso com Ruby.Em Perl, eu usaria o Win32::Console módulo.O console do Windows não responde aos códigos de escape ANSI.

De acordo com artigo sobre como colorir a saída Ruby que artur02 mencionou, você precisa instalar e carregar a gem win32console.

Outras dicas

No Windows, você pode fazer isso facilmente de três maneiras:

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

Agora você poderia estender String com um pequeno método chamado red

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

 puts "Hello, World!".red

Além disso, você pode estender String assim para obter mais cores:

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

Ou, se você puder instalar gemas:

gem install term-ansicolor

E no seu programa:

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

Consulte a documentação do termo/ansicolor para obter mais informações e possíveis usos.

Você pode ler aqui um artigo bom e ilustrado:http://kpumuk.info/ruby-on-rails/colorizing-console-ruby-script-output/

Acho que definir a cor do texto do console é bastante específico do idioma.Aqui está um exemplo em C# do 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 é a propriedade para definir a cor do texto.

Você poderia usar uma sequência de escape ANSI, mas isso não fará o que você deseja nas versões modernas do Windows.A Wikipedia tem um artigo muito informativo:

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

Portanto, a resposta para sua pergunta original é quase certamente "não". No entanto, você pode alterar a cor do primeiro plano sem escrever uma sequência de fuga, por exemplo, invocando uma função da API Win32.Eu não sei como fazer esse tipo de coisa em Ruby de cabeça, mas alguém parece ter conseguido:

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

Imagino que você queira usar 4 para vermelho escuro ou 12 para vermelho brilhante e 7 para restaurar a cor padrão.

Espero que isto ajude!

em códigos de escape ANSI:

Modo de caractere de 32 bits (subsistema:console) Os aplicativos do Windows não gravam sequências de escape ANSI no console

Eles devem interpretar as ações do código de escape e chamar a API nativa do Console

Obrigado microsoft :-(

color [background][foreground]

Onde as cores são definidas da seguinte forma:

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

Por exemplo, para alterar o plano de fundo para azul e o primeiro plano para cinza, digite:

color 18

Eu criei uma pequena jóia multiplataforma que lida com isso perfeitamente, executando em sistemas Windows ou POSIX, tanto em MRI quanto em JRuby.

Não possui dependências e usa códigos ANSI em sistemas POSIX e FFI (JRuby) ou Fiddler (MRI) para Windows.

Para usá-lo, basta:

gem install color-console

ColorConsole fornece métodos para gerar linhas de texto em cores diferentes, usando as funções Console.write e 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

Visite a página inicial do projeto em https://github.com/agardiner/color-console para mais detalhes.

Pelo que eu sei não é possível com linha de comando, é apenas uma cor ...

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();
        }
    }
}

Você pode alterar a cor usando um programa C# simples, http://powerof2games.com/node/31 descreve como você pode agrupar a saída do console para obter o efeito.

A especificação C/C++ padrão para saída para a linha de comando não especifica nenhum recurso para alterar a cor da janela do console.Dito isto, existem muitas funções no Win32 para fazer isso.

A maneira mais fácil de alterar a cor do console Win32 é por meio do comando do sistema em iostream.h.Esta função invoca um comando DOS.Para alterar as cores, usaremos isso para invocar o comando color.Por exemplo, system("Color F1"); tornará o console azul escuro em branco.

Cores DOS

As cores disponíveis para uso com o comando são as dezesseis cores DOS, cada uma representada por um dígito hexadecimal.O primeiro sendo o plano de fundo e o segundo sendo o primeiro plano.

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

Apenas este pequeno toque de cor torna os programas do console mais agradáveis ​​visualmente.No entanto, o comando Color alterará a cor de todo o console.Para controlar células individuais, precisamos usar funções do windows.h.

Faça isso você precisa usar o SetConsoleAttribute função

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

Muito do antigo ANSI Códigos de cores trabalhar.O código para um primeiro plano vermelho é algo como Escape-[31m.Escape é o caractere 27, então é "\033[31m" ou "\x1B[31m", dependendo do seu esquema de escape.

[39m é o código para retornar à cor padrão.

Também é possível especificar vários códigos de uma vez para definir a cor do primeiro plano e do plano de fundo simultaneamente.

Talvez seja necessário carregar ANSI.sys, consulte esta página.

Em última análise, você precisa ligar SetConsoleTextAttribute.Você pode obter um identificador de buffer de tela do console em ObterStdHandle.

Eu tenho usado um programa freeware windows tail chamado baretail (google it) há muito tempo que permite que você execute uma versão do comando unix tail para aplicativo do Windows.Ele permite colorir linhas dependendo das palavras-chave que você definir.O que há de bom nisso como solução é que não está vinculado a um idioma ou configuração específica, etc., você apenas define seu esquema de cores e funciona como um donkey kong.Em meus 10 principais ajudantes de freeware!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top