【问题标题】:Powershell - How to get all the text output from current session as a string?Powershell - 如何将当前会话的所有文本输出作为字符串获取?
【发布时间】:2020-03-07 01:57:25
【问题描述】:

我有一个运行许多命令的长脚本。这些命令通过标准输出和标准错误将文本打印到屏幕上。我想在脚本末尾添加一些逻辑,将所有文本打印到屏幕(标准输出或标准错误)并将其保存到文本文件中。

但是,我确实想要将标准输出和标准错误重定向到文本文件,因为我希望脚本的用户能够看到所有打印到屏幕上的真实文本脚本运行的时间。实际上,在脚本中的某些点,某些命令可能会要求用户输入。相反,我希望能够“GetScreenContentsText()”,然后将其输出写入屏幕。

有没有办法在 PowerShell 中做到这一点?

【问题讨论】:

  • 不是事后,但您可以在调用(或开始)脚本之前运行Start-Transcript -Path transcript.log,它会为您转录会话
  • 我尝试使用 Start-Transcript 进行类似的操作,但我发现从脚本运行时它的行为与您预期的不同。根据我的经验,它真的只对交互式会话非常有用。
  • 这完全取决于你的期望:)

标签: windows powershell windows-server-2016


【解决方案1】:

正如 Mathias 在评论中指出的那样,Start-Transcript cmdlet(后跟匹配的 Stop-Transcript 调用)通常是创建会话记录的正确工具。

但是,Start-Transcript 没有捕获所有内容,并且存在一般问题和限制(从 PowerShell [Core] 7.0 开始编写):

  • 交互式提示Read-Host[Console]::ReadLine()没有转录 - 您既不会看到提示字符串,也不会看到提示的内容用户输入。

  • GitHub issue #10994 中所讨论的,即使是输出也可能会在某些情况下从脚本中丢失

  • 错误消息可以被转录两次,使用转录可以改变脚本的行为 - 请参阅GitHub issue #4645

  • VT 序列(ANSI 转义码)没有被捕获,因此控制台中显示的任何颜色都会丢失。

两个链接的 GitHub 问题中的前者提示了以下response from the PowerShell committee,它反映了 PowerShell 7.0 的现状(已添加重点):

@PowerShell/powershell-committee 对此进行了审核,我们相信一个完整的转录解决方案(如 unix `script 命令)[需要;] 希望看到社区构建一个新的 cmdlet(发布到 PSGallery ) 使用 ptty 或在 Windows 上抓取屏幕缓冲区,但请求超出了当前转录框架的范围。

谈到类 Unix 平台上的 script utility:虽然它通常是 Start-Transcript 的更好替代品(虽然不是设计用于在内部脚本中使用),但 PowerShell 的 @987654334 @ 模块,也用于通过Read-Host 提示用户,不适合它。


至于一种可能的解决方法:不幸的是,听起来您必须在脚本的输出中手动复制提示字符串和用户输入才能在脚本中捕获它们 - if 修改脚本是一个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 2016-10-04
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多