PowerShell:将控制台输出发送到文件而不使控制台静音

13

我有很多PowerShell脚本,其中一个主脚本调用其他子脚本。这些PS脚本又调用Windows CMD脚本、Bash脚本和控制台应用程序。所有这些脚本和应用程序都会向控制台输出消息。例如,PowerShell脚本使用Write-Host命令来实现此目的。

问题: 我如何轻松地将所有这些控制台输出重定向(发送)到某个文件中,同时不要使控制台输出失效(取消)?我想要能够看到控制台输出的进程,也想在日志文件中有消息的历史记录。

谢谢。


如果你打算对输出进行操作,为什么会使用 Write-Host 呢?Write-Host 的作用就是在主机上写入一些内容。在此之后,它就超出了你的脚本控制范围。不过,你可以实现自己的主机,但我猜这样做没那么有趣。 - Joey
4个回答

6
您可以使用PowerShell的tee等效命令:Tee-Object 注:针对此类问题,serverfault.com和/或superuser.com更加适合。

1
我之前尝试使用Tee-Object,但它并没有像我期望的那样实现我的需求。它只会保存使用Write-Output(写入到标准输出)而不是Write-Host的输出到文件中。我不能将所有PS脚本中的Write-Host替换为Write-Output。此外,Tee-Object忽略错误输出(stderr)。我需要将控制台上看到的所有输出重定向到文件中。最理想的情况是,无需重写大写脚本逻辑。 - Roman

5
你可以尝试使用Start-TranscriptStop-Transcript来记录日志。但是需要注意,这种方法有一些限制,例如无法捕获本地exe的输出,并且只适用于当前PowerShell会话。

看起来使用 Start-TranscriptTee-Object 的组合可以抓取所有输出,但是很遗憾,结果会被保存到不同的文件中,没有简单的方法可以合并它们。 - Roman
我也为Diadistis的答案(Tee-Object)投了赞成票,但最终决定接受Keith的答案。实际上,最终解决方案是两个答案的混合体,正如我在之前的评论中提到的那样。对于我的情况来说,两个单独的文件并不是一个大问题。 - Roman

2

1

你可能需要编写一个自定义主机来实现这个功能。这并不是一件非常困难的事情,但它确实需要一些托管代码。


谢谢,迈克。但是这种解决方案对我的情况不合适。 - Roman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接