有关我想要了解的行为的完整上下文,请参见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
)也使用它来写入状态信息。