PowerShell-捕获Git命令的STDERR输出 问题
我试图将PowerShell-捕获Git命令的STDERR输出 问题,git,powershell,logging,error-handling,stderr,Git,Powershell,Logging,Error Handling,Stderr,我试图将STDERR输出捕获到日志文件中;然而,我一直遇到一些严重的不一致的问题,使我的任务更加困难 首先,我的ErrorActionPreference要“停止”,这可能是我正在忍受的问题的一部分 其次,我在下面显示的代码中为每个git命令尝试了两种变体: 变体01 变体02 根据我遇到的常见问题,还有其他几个变体,我混淆了使用哪个命令和哪个变体 我遇到的主要问题是: 1) 每当遇到STDERR输出时,无论消息如何,都会将其视为终止错误 2) 由于多种原因,我尝试创建自定义Try/Catch语
STDERR
输出捕获到日志文件中;然而,我一直遇到一些严重的不一致的问题,使我的任务更加困难
首先,我的ErrorActionPreference
要“停止”,这可能是我正在忍受的问题的一部分
其次,我在下面显示的代码中为每个git命令尝试了两种变体:
变体01
变体02
根据我遇到的常见问题,还有其他几个变体,我混淆了使用哪个命令和哪个变体
我遇到的主要问题是:
1) 每当遇到STDERR
输出时,无论消息如何,都会将其视为终止错误
2) 由于多种原因,我尝试创建自定义Try/Catch
语句失败。对于成功的STDERR
消息,退出代码并不总是相同的。由于消息并不总是使用相同或类似的消息,因此无法对警告以外的任何内容使用纯文本匹配
注意:我尝试在不更改ErrorActionPreference
的情况下执行此操作,除非绝对必要
问题:
是否有人知道如何记录git命令的
STDERR
消息,以便它总是记录响应而不抛出终止错误(真正的严重错误除外?您可以尝试使用-q来抑制git输出。如果存在实际的git错误,它仍然应该是错误的
我想您也可以在Powershell中运行它,而不是在ISE中运行,它应该可以正常工作看来这次我可以回答自己的问题了 通过使用,我了解到一些git命令有一个
--cerial
选项,它允许我将输出转换为机器可读的格式,并通过管道将它们传输到输出。然后,根据命令,结合使用>
和*>
,我得出以下结论:
& 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而生成终止错误。不幸的是,这不是我想要的。我不是试图压制这些信息,也不是默默地绕过它们。我需要这些信息来显示和捕获它们。你能试试看它是否适合你的目的吗?尝试{invoke expression“git command-q”}catch{$};据我所知,使用-q调用表达式将抑制正常输出,只捕获错误,然后在try/catch中捕获错误。我非常感谢您的尝试,但这种方法存在一个巨大的问题。使用-q
或-quiet
会抑制输出,这对我的目标不利。我不仅必须获得捕获/触发的错误,还需要显示所有输出(信息、警告、错误等)并记录该输出。这就是为什么-q
对我不起作用的原因。
& 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
& 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