Git 调用表达式,但并非所有输出都返回到变量

Git 调用表达式,但并非所有输出都返回到变量,git,powershell,powershell-6.0,Git,Powershell,Powershell 6.0,我在PowerShell脚本中使用了一些GIT命令。大多数时候,我都是通过Invoke Expression调用GIT命令的 可以解析输出,或/和 将输出转发到日志记录方法 在一些GIT命令中,我发现并非所有输出都是通过Invoke Expression返回的,尽管状态如下: 输出 PSObject 返回由调用的命令生成的输出(命令参数的值) 以下是一个例子: > $x = iex "git fetch --all" remote: Enumerating obje

我在PowerShell脚本中使用了一些GIT命令。大多数时候,我都是通过
Invoke Expression
调用GIT命令的

  • 可以解析输出,或/和
  • 将输出转发到日志记录方法
在一些GIT命令中,我发现并非所有输出都是通过
Invoke Expression
返回的,尽管状态如下:

输出

PSObject

返回由调用的命令生成的输出(命令参数的值)

以下是一个例子:

> $x = iex "git fetch --all"
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
$x的内容

> $x
Fetching origin
Fetching upstream
因此,主信息不会返回到
$x
。我无法想象,
git fetch——所有的
都是通过
stderr
返回主要信息的(没有意义…)

我还发现了这个PowerShell,它没有回答,使用的PowerShell版本是2

已使用的PowerShell版本:

> $PSVersionTable

Name                           Value
----                           -----
PSVersion                      6.2.0
PSEdition                      Core
GitCommitId                    6.2.0
OS                             Microsoft Windows 10.0.18362
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0
如何强制
调用Expression
返回整个输出

Thx

试试这个(没有iex)

如我在“”中所述,使用,您可以尝试先设置:

set GIT_REDIRECT_STDERR=2>&1
然后在Powershell脚本中,您应该同时获得stdout和stderr输出

另请参见,以获取更类似于Powershell的示例:

$env:GIT_REDIRECT_STDERR = '2>&1'
具体来说,它可以与git配合使用,但值得讨论一个通用解决方案:


注意:并且没有理由将其用于调用外部程序:只需直接调用它们并分配给变量:

$capturedStdout = git ... # capture git's stdout output as an array of lines
如前所述,
git
将状态信息输出到stderr
,而数据输出到stdoutPowerShell变量分配仅捕获标准输出[1]

要捕获stdout和stderr的组合,在打印到终端时交错,您可以使用重定向
2>&1
,就像在其他shell中一样,将错误流/stderr(
2
)合并到(
&
)数据输出流中(stdout等效,
1
-请参阅):

警告:如果
$ErrorActionPreference='Stop'
恰好有效,则使用
2>
会意外触发终止错误;中讨论了这种有问题的行为

但是,其他壳的行为没有明显差异:

  • 输出将是一个行数组,而不是单个多行字符串

  • 正如预期的那样,源于stdout的行表示为字符串,但源于stderr的行实际上是
    System.Management.Automation.ErrorRecord
    实例,尽管它们像字符串一样打印,并且在转换为字符串时会复制原始行,例如,将结果发送到外部程序时

基于数组的结果有利于解析;e、 例如,要查找包含“解包”一词的行,请执行以下操作:

PS> $combinedOutput -match 'unpacking'
Unpacking objects: 100% (4/4), done.
$combinedOutput = git fetch --all 2>&1 | Out-String
如果您希望接收单行、多行字符串,请执行以下操作:

$combinedOutput = (git fetch --all 2>&1) -join "`n"  # \n (LF); or: [Environment]::NewLine 
如果您不介意将尾随的换行符作为字符串的一部分,则可以更简单地使用
Out string

PS> $combinedOutput -match 'unpacking'
Unpacking objects: 100% (4/4), done.
$combinedOutput = git fetch --all 2>&1 | Out-String


[1] 有关在PowerShell中捕获外部程序输出的全面信息,请参阅。

建议直接调用而不是毫无意义地使用
调用表达式
,这是一个好主意,但OP的主要问题是无法同时捕获stderr输出。