Я использую PowerShell для запуска программы (pyinstaller) записывает все результаты выполнения в STDERR. Я хочу, чтобы вывод этой команды был распечатан на консоли и сохранен в файл.
Сначала я использовал это: COMMAND | tee compile.log
. На консоли все выглядело хорошо, но файл журнала был пуст. Итак, я попробовал это: COMMAND 2>&1 | tee compile.log
. Это привело к тому, что файл журнала был записан правильно, но это вызвало огромные проблемы:
Итак, есть ли что-нибудь, что я могу использовать, чтобы отображать прогресс в консоли и записывать его в файл, но не выглядеть как ошибка?
Не тот, кто голосовал против, но я предполагаю, что это связано с трудностями в оказании вам помощи, поскольку мы буквально ничего не знаем о «раздражающей программе», которую вы используете.
@DougMaurer ОК. Программа представляет собой pyinstaller, что раздражает, поскольку она выводит данные только на stderr.
Вместо того, чтобы упоминать это в комментарии, вам следует отредактировать свой вопрос, добавив в него всю необходимую информацию. А поскольку программа, с которой у вас возникли проблемы, связана с Python, вы можете добавить соответствующий тег к своему вопросу. Это может спровоцировать кого-то, кто действительно имеет с этим опыт. ☝🏼😉
$PSStyle.OutputRendering = 'PlainText'
возможно поможет
Это потому, что вы захватываете только второй (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 узнает, какое свойство распечатывать по умолчанию)
Чтобы подавить red
ANSI-коды , вы можете просто передать вывод командлету 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
Другая проблема, вероятно, не связана с вышеизложенным и действительно слишком расплывчата, чтобы на нее можно было дать ответ. Если эта часть все еще вызывает беспокойство, я бы предложил открыть для нее отдельный вопрос с более подробной информацией о кодах выхода, которые вы на самом деле получаете, а также о том, какие коды выхода вы ожидаете и как вы пытаетесь их перехватить.
Может ли кто-нибудь прокомментировать, почему этот вопрос следует отклонить?