Tee только STDERR в Powershell без красного текста

Я использую PowerShell для запуска программы (pyinstaller) записывает все результаты выполнения в STDERR. Я хочу, чтобы вывод этой команды был распечатан на консоли и сохранен в файл.

Сначала я использовал это: COMMAND | tee compile.log. На консоли все выглядело хорошо, но файл журнала был пуст. Итак, я попробовал это: COMMAND 2>&1 | tee compile.log. Это привело к тому, что файл журнала был записан правильно, но это вызвало огромные проблемы:

  • Весь вывод на консоли имел красный цвет ошибки.
  • Независимо от того, была ли команда успешной, код выхода сообщает, что произошла ошибка.

Итак, есть ли что-нибудь, что я могу использовать, чтобы отображать прогресс в консоли и записывать его в файл, но не выглядеть как ошибка?

Может ли кто-нибудь прокомментировать, почему этот вопрос следует отклонить?

Enderbyte09 05.05.2024 04:24

Не тот, кто голосовал против, но я предполагаю, что это связано с трудностями в оказании вам помощи, поскольку мы буквально ничего не знаем о «раздражающей программе», которую вы используете.

Doug Maurer 05.05.2024 05:52

@DougMaurer ОК. Программа представляет собой pyinstaller, что раздражает, поскольку она выводит данные только на stderr.

Enderbyte09 05.05.2024 05:55

Вместо того, чтобы упоминать это в комментарии, вам следует отредактировать свой вопрос, добавив в него всю необходимую информацию. А поскольку программа, с которой у вас возникли проблемы, связана с Python, вы можете добавить соответствующий тег к своему вопросу. Это может спровоцировать кого-то, кто действительно имеет с этим опыт. ☝🏼😉

Olaf 05.05.2024 10:23
$PSStyle.OutputRendering = 'PlainText' возможно поможет
Santiago Squarzon 05.05.2024 14:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
5
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Весь вывод на консоли имел красный цвет ошибки.

Это потому, что вы захватываете только второй (2) Поток ошибок.

Этот поток создает ErrorRecord:

$Output = Write-Error 'Something went wrong' 2>&1
$Output.GetType().FullName
System.Management.Automation.ErrorRecord

Они окрашены в соответствии с видом отображения PowerShell по умолчанию, определенным в этом скрипте свойств:

$FormatData = Get-FormatData System.Management.Automation.ErrorRecord
$FormatData.FormatViewDefinition.Control.Entries.CustomItems.Expression.Value

(Подробнее см. в ответе: Как Powershell узнает, какое свойство распечатывать по умолчанию)

Чтобы подавить redANSI-коды , вы можете просто передать вывод командлету Out-String, поскольку он позволяет сценарию FormatViewDefinition поверить, что он записывает во что-то, что не поддерживает ANSI:

Write-Error 'Something went wrong' 2>&1 | tee compile.log | Out-String

Чтобы захватить все потоки (а не только красный ErrorRecord), используйте звездочку:

Write-Error 'Something went wrong' *>&1 | tee compile.log | Out-String

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

Другие вопросы по теме