Ваш собственный ответ показывает эффективное решение с помощью Start-Transcript
.
По причине:
Это не ' t Tee-Object
, который отбрасывает цвета , но сам скрипт Python , предположительно потому, что модули, которые вы используете для окрашивания, обнаруживают, что вывод не отправляется на screen (терминал) .
Такое поведение является заданным: логическое обоснование состоит в том, что если вы отправляете что-то в файл или по конвейеру, вас интересует только необработанная текстовая информация, не окраска. Некоторые утилиты Unix позволяют переопределить это поведение по умолчанию с помощью параметров командной строки (например, GNU grep
имеет --color=always
).
Модуль coloroma , похоже, имеет такой Функция переопределения тоже (не смотрела на termcolor
), через ее функцию init()
(init(strip=False)
) - однако, вам не захочется жестко связывать это поведение с вашими сценариями, поэтому, возможно, реализовать командную строку опция, аналогичная GNU grep
, является опцией.
Быстрая демонстрация того факта, что Tee-Object
действительно передает последовательности VT (виртуальный терминал) / цветовые коды ANSI через:
# The VT escape sequences (ANSI codes) *are* sent to log.txt
# Prints the word "green" in green, both instantly and when calling
# Get-Content log.txt later.
"It ain't easy being $([char] 27)[32mgreen$([char] 27)[m." | Tee-Object log.txt
Предостережение :
In Windows PowerShell (до версии 5.1) - по крайней мере с выходом colorama
- пустые строки заполняются цветом фона, который действует , когда они проходят через Tee-Object
, потому что система форматирования вывода дополняет строки вывода пробелами.
PowerShell [Core] 7 + больше не имеет этой проблемы.