有关我想要了解的行为的完整上下文,请参见this question

我对Start-Transcript的理解是,一旦启动,所有输出流都将记录到Powershell脚本中。我可以写入流1-6,但仍然希望在笔录中看到输出。但是,在我上面链接的问题中,我看到了一些我无法解释的奇怪现象,并且想了解为什么在这种情况下会吞噬输出,在这种情况下,我们每个人都看到了不同的行为。

基本上,OP试图将git clone | Out-Default记录到其成绩单日志中,但没有任何内容注销到成绩单中。对他们有用的解决方案是设置一个环境变量,使git写入stdout而不是stderr。 OP后来表示,他们曾尝试将git命令传递给Out-Default来查看它是否有所不同,但实际上没有,因此,他们的解决方案似乎是“git输出到stderr,而不会被Start-Transcript捕获。

但是,我的经历有所不同。我没有配置git来将stderr重定向到stdout,并且可以通过尝试将git命令的输出分配给变量来确认这一点(如我所料,它不起作用)。但是我可以简单地调用Start-Transcript,然后调用git status,然后查看它记录到脚本中。但是,当我运行git status | Out-Default时,我将输出输出到控制台,但未记录到脚本。删除Out-Default似乎是我的解决方案,但不是OP。

我对这里发生的事情一无所知。在我的系统上,似乎将git命令(仅git命令)传递到Out-Default不允许将输出记录到笔录中。我已经用其stderr输出测试了其他外部程序,并将输出管道传输到Out-Default仍然允许输出被转录。但不是git blah | Out-Default。而且我仍然不明白为什么另一个问题的OP需要将stderr重定向到stdout,但是我不需要。

最佳答案

您看到的是错误,它在以下情况下出现:

  • 正在进行转录(从Start-Transcript开头)
  • 外部程序(例如git)正在被调用,并且(也)输出到stderr(标准错误流)。
  • 外部程序调用通过管道传递给Out-Default

  • 然后,stderr的输出意外地未记录在脚本中。[1]

    已在this GitHub issue中报告了该问题,但必须注意:
  • 在这种情况下,没有没有理由调用Out-Default ,因为默认情况下,脚本会记录外部程序的stdout和stderr输出。
  • 通常没有理由从用户代码中调用Out-Default。它旨在由PowerShell主机应用程序调用。

  • 有关更多信息,请参见this answer

    [1]请注意,通常将外部程序的stderr输出与PowerShell命令的错误输出区别对待:除非重定向,否则默认情况下,stderr行将显示在显示器上,而不会触及PowerShell的错误流(因此也不会记录在$Error中),因为通常不能假定stderr代表错误,所以考虑到许多程序(包括git)也使用它来写入状态信息。

    08-27 18:24
    查看更多