3

Я использую различные программы Linux на моей машине с Windows; некоторые из них имеют цветной вывод. GnuWin32 и пр.

Однако Windows PowerShell не поддерживает цвета Linux; он получает сообщение, подобное ←[0m31m(который является кодом управления цветом), и отображает его вместо цвета.

Есть ли способ обойти это?

6 ответов6

3

Powershell - это просто программа в текстовом режиме, работающая в консоли Windows. Консоль Windows не поддерживает escape-последовательности ANSI, что вы и видите.

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

3

Вы можете использовать Cygwin для запуска сценариев PowerShell и PowerShell:

альтернативный текст

Cygwin может обрабатывать escape-последовательности.

3

Я также искал хорошее решение, но не мог найти ...

Вот короткий скрипт PowerShell для перевода цветовых кодов 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       }
              }
          }
      }
  }

Использование:

Open-Colored .\myColoredLogfile.log

В настоящее время я понятия не имею, как интегрировать это в страницы (например, меньше) или как написать собственный простой пейджер, как меньше.

PSCX поставляется с меньшим количеством клонов, но не имеет поддержки цветового кода ANSI (пока)...

3

Для потомков

Вы можете использовать ANSICON для отображения escape-последовательностей ANSI на консолях Windows, включая Powershell. Это должно дать вам цвет.

Этот поток вопросов о том, как заставить его работать с PowerShell, имеет несколько различных решений, поскольку существует несколько способов сделать это.

0

Вы сказали, что используете Mercurial для запуска программ Linux. Предполагая, что вы имеете в виду систему управления исходным кодом (я не подозревал, что она может запускать программы для Linux; я использую ее только для управления исходным кодом), есть расширение, которое позволит вам показывать цвет. Wincolor перехватит управление цветом ANSI и вызовет соответствующие функции Windows. Кажется, что работает, несмотря ни на что, но я думаю, что это работает лучше с установленной Pyreadline .

Примечание: я пробовал это без pyreadline, и это не сработало для меня. Я еще не пробовал это с pyreadline.

0

Вы можете использовать виртуальную машину Linux для запуска этих сценариев. Это большой результат для небольшого результата, если он просто показывает цвета, но это не помешает запускать скрипты на платформе, для которой они были созданы.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .