PowerShell não exibe cores do Unix

3

Eu uso vários programas Linux na minha máquina Windows; alguns deles têm saída colorida. GnuWin32 e assim por diante.

No entanto, o Windows PowerShell não suporta cores do Linux; ele recebe uma mensagem como ←[0m31m (que é o código de controle de cor) e processa isso em vez da cor.

Existe alguma maneira de contornar isso?

    
por Paul Nathan 18.12.2009 / 17:44

6 respostas

3

O Powershell é apenas um programa no modo de texto, executado no console do Windows. O console do Windows não suporta seqüências de escape ANSI , que é o que você está vendo.

Para consertar, depende muito do programa que você está usando. Eu estou supondo que você use cygwin para executar esses scripts?

    
por 18.12.2009 / 19:29
3

Você pode usar o Cygwin para executar scripts do PowerShell e do PowerShell:

O Cygwin pode lidar com as sequências de escape.

    
por 18.12.2009 / 19:42
3

Para a posteridade

Você pode usar ANSICON para exibir sequências de escape ANSI nos consoles do Windows, incluindo o Powershell. Isso deve dar cor a você.

Esta discussão sobre como fazer isso funcionar com o PowerShell tem algumas soluções diferentes, pois há mais de uma maneira de fazer isso.

    
por 22.08.2012 / 15:14
3

Eu também estava procurando por uma boa solução, mas não encontrei nenhuma ...

Aqui está um pequeno script do PowerShell para traduzir códigos de cores ANSI:

function Open-Colored([String] $Filename)
  { Write-Colored(cat -Raw $Filename) }

function Write-Colored([String] $text)
  { # split text at ESC-char
    $split = $text.Split([char] 27)
    foreach ($line in $split)
      { if ($line[0] -ne '[')
          { Write-Host $line -NoNewline }
        else
          { if     (($line[1] -eq '0') -and ($line[2] -eq 'm')) { Write-Host $line.Substring(3) -NoNewline }
            elseif (($line[1] -eq '3') -and ($line[3] -eq 'm'))
              { # normal color codes
                if     ($line[2] -eq '0') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor Black       }
                elseif ($line[2] -eq '1') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkRed     }
                elseif ($line[2] -eq '2') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkGreen   }
                elseif ($line[2] -eq '3') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkYellow  }
                elseif ($line[2] -eq '4') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkBlue    }
                elseif ($line[2] -eq '5') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkMagenta }
                elseif ($line[2] -eq '6') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor DarkCyan    }
                elseif ($line[2] -eq '7') { Write-Host $line.Substring(4) -NoNewline -ForegroundColor Gray        }
              }
            elseif (($line[1] -eq '3') -and ($line[3] -eq ';') -and ($line[5] -eq 'm'))
              { # bright color codes
                if     ($line[2] -eq '0') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor DarkGray    }
                elseif ($line[2] -eq '1') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Red         }
                elseif ($line[2] -eq '2') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Gree        }
                elseif ($line[2] -eq '3') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Yellow      }
                elseif ($line[2] -eq '4') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Blue        }
                elseif ($line[2] -eq '5') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Magenta     }
                elseif ($line[2] -eq '6') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor Cyan        }
                elseif ($line[2] -eq '7') { Write-Host $line.Substring(6) -NoNewline -ForegroundColor White       }
              }
          }
      }
  }

Uso:

Open-Colored .\myColoredLogfile.log

Atualmente, não tenho ideia de como integrar isso em páginas (por exemplo, menos) ou como escrever um pager simples como menos.

O

PSCX vem com menos clone, mas não possui suporte a código de cores ANSI (ainda) ...

    
por 12.05.2015 / 00:16
0

Você pode usar uma máquina virtual Linux para iniciar esses scripts. Isso é uma grande coisa para um resultado pequeno, se for apenas mostrar cores, mas não pode ser ruim executar os scripts na plataforma para a qual foram feitos.

    
por 18.12.2009 / 17:47
0

Você disse que estava usando o Mercurial para executar os programas do Linux. Supondo que você esteja se referindo ao sistema de controle de origem (que eu não sabia que poderia executar programas do Linux; eu só o utilizo para controle de código-fonte), há uma extensão que permite que você mostre a cor. Wincolor interceptará o controle de cores ANSI e chamará as funções apropriadas do Windows. Parece funcionar, não importa o que aconteça, mas acho que funciona melhor com a pyreadline instalada.

Nota: Eu treid isso sem pyreadline, e não funcionou para mim. Eu ainda não tentei com pyreadline.

    
por 29.03.2010 / 20:08