问题
我正在尝试将 STDERR
输出捕获到日志文件中;但是,我一直遇到一些严重的不一致问题,这让我的任务变得更加困难。
首先,我将 ErrorActionPreference
设置为“停止”,这可能是我遇到的部分问题。
其次,我在下面显示的代码中为每个 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
消息,以便它始终记录响应而不引发终止错误,真正的严重错误除外?
最佳答案
看来这次我要回答我自己的问题了。
使用 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
关于git - PowerShell - 捕获 Git 命令的 STDERR 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47402329/