如何准备当前PowerShell脚本的输出流?

sco*_*obi 3 powershell logging

我有一个PowerShell脚本,可以输出到stdout和stderr。我想同时将它们发送到几个日志文件中。

最好的方法是什么?

我考虑过的几件事:

  • 使用执行tee的函数包装写错误和写输出。
    • 我不太喜欢它,因为(a)我失去了将值放在行上并自动输出的简单能力,并且(b)我必须包装要调用的每个位置,包括本地exe文件,可能会有输出并包装它们。
  • 包装执行T恤的外部脚本。
    • 这样会好一些,但是现在我遇到了需要param()从外部脚本中复制内部脚本中的代码块的问题。我可以完全移动param()块,但有时我也想调用内部脚本以进行测试(即未获得T恤)。我想我可以在外部脚本中使该行为成为可选行为。

我记得当我以前写过一些perl时,有一种便捷的方法可以通过一个钩子全局重定向所有stdout / err输出。PowerShell可能会发生这种情况吗?

sco*_*obi 5

哎呀 我应该在Google上呆几分钟。

开始成绩单可以做到这一点!

http://technet.microsoft.com/zh-CN/library/dd347721.aspx

..虽然它不捕获exe的输出,但仅捕获PowerShell。这是一个很好的解决方法:

https://web.archive.org/web/20111106093956/blog.magenic.com/blogs/daniels/archive/2008/07/14/Output-Issue-with-Transcript-in-Powershell.aspx

另一个更新:我发现Start-Transcript使用主机窗口缓冲区宽度,当在系统帐户或任何其他帐户上运行计划任务时,该宽度太窄。解决方法如下。在脚本顶部添加以下内容:

try
{
    $host.ui.rawui.buffersize = `
        new-object system.management.automation.host.size `
            200, $host.ui.rawui.buffersize.height
}
catch {}
Run Code Online (Sandbox Code Playgroud)

将200更改为所需的成绩单宽度。