Сохранить цвет из конвейерного вывода

У меня есть этот чрезвычайно простой скрипт powershell, который добавляет к каждой строке число.

function number
{    
    $i = 0;
    foreach($line in $input)
    {
        [string]$i + ":" + $line
        ++$i
    }
}

Я хотел бы, чтобы эта функция сохраняла цвета ввода. Например, если я выполню следующую команду, цвета будут потеряны:

git status -s | number

При выполнении

git status -s

Дает мне красиво окрашенный результат. Что я могу изменить в своей функции powershell, чтобы выполнить это.

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

Это не дубликат вопроса, который ранее был помечен как дубликат.

Я видел этот вопрос, который на самом деле о том, как предотвратить запись MSBuild в стандартную ошибку, а не в стандартный вывод, что в этом случае предотвратило отображение цветов. Единственное, что похоже в этом вопросе и этом, - это заголовок. Другой ответ (с преобразованием HTML) здесь не применяется, поскольку для этого требуется, чтобы данные записывались в консоль, а не передавались по каналу.


person Roy T.    schedule 31.08.2016    source источник


Ответы (3)


Насколько мне известно, вы не можете сохранить цвета, выводимые git status -s, или любой другой вывод команды, который передается в PowerShell через StdIn. Информация о цвете текста, передаваемого в функцию PowerShell через StdIn, «теряется».

Единственный способ, которым я могу думать о добавлении цвета, - это выполнить совпадения RegEx или раскрашивание на основе позиций, используя несколько Write-Host "line section" -ForegroundColor COLOR -NoNewline для каждого цветного раздела.

Консоль использует System.IO.StreamReader для приема ввода через StdIn. Попробуйте выполнить эту команду [Console]::In | Get-Member в PowerShell/ISE.

person TechSpud    schedule 31.08.2016
comment
К сожалению, так оно и есть. Жаль, что я наткнулся на несколько ответов для других оболочек (bash), в которых это возможно. - person Roy T.; 31.08.2016
comment
Раскраска на основе регулярных выражений интересна, но обратите внимание, что PowerShell действительно пропускает цветовые коды, вам просто нужно убедиться, что команда ввода испускает их, даже если ее стандартный вывод подключен к конвейеру, для чего обычно требуется - специфичная для утилиты - опция, такая как -c color.status=always в случае команды Роя. - person mklement0; 19.03.2018

  • Утилиты (программы командной строки), которые поддерживают раскрашенный вывод, обычно опускают цветовые коды, когда их стандартный вывод не подключен к терминалу (консоли), например например, когда вывод перенаправляется в файл или отправляется по конвейеру.

    • The idea is not to pollute the data with formatting instructions if the intent is programmatic processing of the output (as opposed to display in the terminal).
  • В этом случае вы должны использовать параметр, зависящий от утилиты, ЕСЛИ поддерживается, чтобы принудительно безоговорочно использовать цвет.

PowerShell действительно пропускает цветовые коды через конвейер, поэтому что-то вроде следующего, выполненное из каталога с репозиторием git, должно давать цветной вывод.

PS> git -c color.status=always status -b --short | % { $i=0 } { "$((++$i)): $_" }
1: ## master

Слово master (или любая другая активная ветвь) должно отображаться зеленым.

ответ, из которого взят метод -c color.status=always, был обновлен, так как вы связались с ним, поэтому я подозреваю, что более ранняя форма была просто не эффективен для форсирования безусловного цветного вывода.

person mklement0    schedule 19.03.2018

Если вы пишете o/p в консоль [Хост - если быть точным]. Вы можете использовать командлет Write-Host, который предоставляет свойства «передний план» и «фон», которые вы можете использовать для установки цветов по вашему выбору.

person Manjunath Rao    schedule 31.08.2016
comment
Это позволяет мне только устанавливать свои собственные цвета, а не повторно использовать цвета, выведенные Git. - person Roy T.; 31.08.2016