gpt4 book ai didi

powershell - 抑制来自 Powershell $error 的外部命令错误输出

转载 作者:行者123 更新时间:2023-12-02 22:39:03 24 4
gpt4 key购买 nike

在我的个人资料中,我通过 prompt 自定义了提示。嵌入git分支信息的函数:

function prompt
{
$prefix = ""
if ((test-path ".git") -or (test-path ".gitdir") -or ((git rev-parse --is-inside-work-tree 2> $null) -eq "true")) {
$prefix = "[git:" + (& git symbolic-ref --short HEAD) + "]"
}

write-host "PS $prefix $(get-location) >" -nonewline -foregroundcolor DarkMagenta
return " "
}

然而,问题是当我在 git 树之外时, git rev-parse部分检查将错误插入 $error即使我将错误重定向到 $null。

这意味着 $error 被以下错误污染,因为它在每次提示呈现时生成:
git : fatal: Not a git repository (or any of the parent directories): .git
At C:\temp\prompt.ps1:4 char:64
+ ... ".gitdir") -or ((git rev-parse --is-inside-work-tree 2> $null) -eq "t ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (fatal: Not a gi...ectories): .git:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

交互式运行我注意到 2> $null确实将错误抑制到控制台,但错误仍然出现在 $error 中:
PS C:\temp> $error
PS C:\temp> git rev-parse --is-inside-work-tree 2> $null
PS C:\temp> $error
git : fatal: Not a git repository (or any of the parent directories): .git
At line:1 char:1
+ git rev-parse --is-inside-work-tree 2> $null
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (fatal: Not a gi...ectories): .git:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

PS C:\temp>

我试过将命令包装在 try {...} catch {} 中,并且还使用 invoke-command错误操作为 ignore ,两者都没有运气:
PS c:\temp> $error.clear()
PS c:\temp> $error
PS c:\temp> invoke-command -scriptblock { git rev-parse --is-inside-work-tree 2> $null } -erroraction ignore
PS c:\temp> $error
git : fatal: Not a git repository (or any of the parent directories): .git
At line:1 char:31
+ ... d -scriptblock { git rev-parse --is-inside-work-tree 2> $null } -erro ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (fatal: Not a gi...ectories): .git:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

PS c:\temp> $error.clear()
PS c:\temp> $error
PS c:\temp> try { git rev-parse --is-inside-work-tree 2> $null } catch { }
PS c:\temp> $error
git : fatal: Not a git repository (or any of the parent directories): .git
At line:1 char:7
+ try { git rev-parse --is-inside-work-tree 2> $null } catch { }
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (fatal: Not a gi...ectories): .git:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError

PS c:\temp>

如何抑制此错误添加到 $error所以它保持干净?

最佳答案

不幸的是,从 PowerShell Core 6.2.1/Windows PowerShell v5.1 开始,使用 2>$null意外地抑制来自外部程序的 stderr 输出仍然需要通过 Powershell 的错误流(流 2 )绕道而行,因此输出仍然记录在 $Error 中。 .此已知问题在 this GitHub issue 中有所描述。 .

作为解决方法,您可以调用 git通过 cmd /c (或 sh -c 在 Unix 上)并让它进行重定向:

# Windows
cmd /c 'git rev-parse --is-inside-work-tree 2>NUL'

# Linux, macOS
sh -c 'git rev-parse --is-inside-work-tree 2>/dev/null'

正如您所说,这将正确通过 git的退出代码,以便您可以通过 $LASTEXITCODE 确定成功然后。

关于powershell - 抑制来自 Powershell $error 的外部命令错误输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56393176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com