【问题标题】:PowerShell - Capturing STDERR Output for Git CommandsPowerShell - 为 Git 命令捕获 STDERR 输出
【发布时间】:2018-05-04 06:44:46
【问题描述】:

问题

我正在尝试将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 powershell logging error-handling stderr


    【解决方案1】:

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

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

    【讨论】:

    • 不幸的是,这不是我想要的。我不是试图压制这些消息或默默地绕过它们。我需要显示这些消息并能够捕获它们。
    • 你能试试看它是否适合你的目的吗? try{invoke-expression "git command -q"}catch{$_};据我所知,带有 -q 的调用表达式将抑制正常输出,只捕获错误,然后在 try/catch 中捕获。
    • 非常感谢您的尝试,但这种方法存在很大问题。使用-q-quiet 会抑制输出,这不利于我的目标。我不仅必须捕获/触发错误,而且还需要显示所有输出(信息、警告、错误等)并记录该输出。这就是为什么-q 对我不起作用的原因。
    【解决方案2】:

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

    使用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 而产生终止错误

    【讨论】:

      猜你喜欢
      • 2012-11-22
      • 2018-05-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-26
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多