PowerShell - 捕获Git命令的标准错误输出

3

问题

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

首先,我的 ErrorActionPreference 设置为 'Stop',这可能是我遭受的问题的一部分。

其次,我已经尝试了以下代码中每个 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

Variant 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的情况下完成此操作。
问题
有人知道如何处理记录STDERR消息的git命令,以便始终记录响应,而不会引发终止错误,除非是真正的关键错误吗?
2个回答

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也非常有帮助,可以在触发任何错误的同时实现所需结果,而不仅仅是因为来自标准错误而生成终止错误。

0

你可以尝试使用-q来抑制git输出。如果有实际的git错误,它仍然会报错。

我认为你也可以在纯PowerShell中运行它,而不是ISE,这样应该可以正常工作。


1
很遗憾,这并不是我想要的。我并不想压制这些消息或者默默地绕过它们。我需要这些消息显示出来,以便能够捕获它们。 - Brandon
你能试一下看看这是否适合你的目的吗?尝试{ invoke-expression "git command -q" } 捕获 { $_ };据我所知,使用 -q 的 invoke-expression 将抑制正常输出,并仅捕获错误,然后在 try/catch 中捕获。 - Shadowzee
1
非常感谢您的尝试,但是这种方法存在一个巨大的问题。使用“-q”或“-quiet”会抑制输出,这对我的目标是有害的。我不仅需要捕获/触发错误,还需要显示所有输出(信息、警告、错误等)并记录该输出。这就是为什么“-q”对我无效的原因。 - Brandon

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