Powershell - Как получить весь текстовый вывод из текущего сеанса в виде строки? - PullRequest
1 голос
/ 07 марта 2020

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

Однако я делаю not хочу перенаправить стандартный вывод и стандартную ошибку в текстовый файл, потому что я хочу, чтобы пользователь скрипта мог видеть весь текст, выводимый на экран в режиме реального времени при запуске скрипта. Действительно, в некоторых точках сценария некоторые команды могут запрашивать ввод данных пользователем. Вместо этого я хочу иметь возможность "GetScreenContentsText ()" и затем записать вывод этого на экран.

Есть ли способ сделать это в PowerShell?

1 Ответ

1 голос
/ 07 марта 2020

Как указывает Матиас в комментарии, Start-Transcript командлет (за которым следует соответствующий вызов Stop-Transcript), как правило, является правильным инструментом для создание стенограммы сеанса .

Однако Start-Transcript не захватывает всего и имеет общие проблемы и ограничения (записано как PowerShell [ Core] 7.0):

  • Интерактивные подсказки (Read-Host, [Console]::ReadLine()) не расшифрованы - вы не увидите ни строки приглашения, ни того, что набрал пользователь.

  • Четный вывод может ситуативно отсутствовать в транскрипте, как обсуждалось в этой проблеме GitHub .

  • Сообщения об ошибках могут быть расшифрованы дважды , и использование транскрипции может изменить поведение сценария - см. этот выпуск GitHub .

  • Последовательности VT (escape-коды ANSI) не захвачены , так любая окраска, отображаемая в консоли, будет потеряна.

Прежний из двух связанных проблем GitHub вызвал следующий ответ от комитета PowerShell , который отражает статус-кво как PowerShell 7.0 (выделение добавлено):

@ PowerShell / powershell-Committee рассмотрел это, мы считаем, что для транскрипции необходимо полное решение (например, команда сценария unix) [;] хотел бы, чтобы сообщество создало новый командлет (опубликованный в PSGallery), который использует ptty или при Windows захват экранного буфера , но запрос выходит за рамки текущей структуры транскрипции.

Кстати, об утилите script на Unix -подобных платформах: хотя в целом она является превосходной альтернативой Start-Transcript (хотя и не предназначена для использования с внутри скриптов) модуль PowerShell PSReadLine, который также используется для запроса пользователей через Read-Host, не очень хорошо с ним работает.


Что касается возможной работы round: к сожалению, похоже, что вам придется вручную дублировать строки подсказок и вводимые пользователем данные в выводе вашего скрипта, чтобы они были записаны в стенограмме - , если является модификацией скрипта.

...