PowerShell - 捕获Git命令的STDERR输出

时间:2017-11-20 22:39:37

标签: git powershell logging error-handling stderr

问题

我正在尝试将STDERR输出捕获到日志文件中;但是,我遇到了一些严重的不一致问题,这些问题使我的任务更加困难。

首先,我有ErrorActionPreference到'停止',这可能是我忍受的问题的一部分。

其次,我在下面显示的代码中为EACH git命令尝试了两种变体:

变体01

& git add $path2File 2>&1 | Out-File "$LogPath\$tmpLogName" -Append
& git commit -m "Some logical update message" 2>&1 | Out-File "$LogPath\$tmpLogName" -Append
& git status 2>&1 | Out-File "$LogPath\$tmpLogName" -Append
& git push 2>&1 | Out-File "$LogPath\$tmpLogName" -Append

变体02

& git add $path2File 2>&1 >> "$LogPath\$tmpLogName" -Append
& git commit -m "Some Logical update message" 2>&1 >> "$LogPath\$tmpLogName" -Append
& git status 2>&1 >> "$LogPath\$tmpLogName" -Append
& git push 2>&1 >> "$LogPath\$tmpLogName" -Append

还有其他一些变体,其中混合了哪个命令根据我遇到的常见问题使用哪个变体。

我遇到的主要问题是:

1)每当遇到STDERR输出时,无论消息如何,都会将其视为终止错误。

2)由于多种原因,我创建自定义Try/Catch语句的尝试失败了。成功的STDERR消息的退出代码并不总是相同。由于消息并不总是使用相同或类似的消息,因此无法将纯文本匹配用于除警告之外的任何内容。

注意:我试图在不更改ErrorActionPreference的情况下执行此操作,除非绝对必要。

问题

有没有人知道如何处理为git命令记录STDERR消息,以便它始终记录响应而不会引发终止错误,除了真正的严重错误?

2 个答案:

答案 0 :(得分:1)

这次看起来我可以回答我自己的问题。

使用git-scm.com/docs我能够了解到某些git命令有一个--porcelain选项,它允许我将输出转换为机器可读格式并将它们输出到输出。然后,根据命令使用>>*>>的组合,我想出了以下内容:

& git checkout --track $branch >> $logFilePath

# some set of actions

& git add . *>> $logFilePath
& git commit -m "some automated update message" *>> $logFilePath
& git status --porcelain >> $logFilePath
& git push --porcelain >> $logFilePath

这使我能够获得我想要记录的信息而没有错误的终止错误,如果我需要屏蔽任何内容(IP地址,PI等),我可以在记录或显示之前这样做。

如果没有必要这样做,使用Tee-Object对于实现期望的结果也非常有帮助,同时仍然适当地触发任何错误而不仅仅因为它来自STDERR

答案 1 :(得分:0)

您可以尝试使用-q来抑制git输出。如果存在实际的git错误,它仍然应该是错误的。

我认为您也可以在Powershell中运行它,而不是ISE并且它应该正常运行