PowerShell:在函数内处理调用结果-最佳做法

时间:2019-03-07 14:50:21

标签: powershell

我有一个函数,在那个函数中,我正在调用git函数:

function Confirm-GitStatus
{
    # a bunch of stuff
    & git --git-dir $gitDir --work-tree $basePath  checkout $targetBranch 2>&1
    # more stuff
    return $true
}

其结果实际上是一个数组,其中包含git调用和$ true的结果。为了获得想要的结果,我必须这样做:

$disposableMessage = & git --git-dir $gitDir --work-tree $basePath  checkout $targetBranch 2>&1

这感觉很糟糕。拨打电话和扔出结果的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

您可以将命令传递给Out-Null

答案 1 :(得分:0)

由于您始终在使用流重定向-2>&1将PowerShell错误流(来自git的stderr)合并到成功流(来自stdout) )-最简单的解决方案是使用 * 所有流($null)重定向到*> $null ;一个简化的例子:

# Note: This command produces both stdout and stderr output.
cmd /c "echo hi & dir \nosuch" *> $null

# PowerShell Core example with Bash:
bash -c 'echo hi; ls \nosuch'  *> $null

但是, 通常考虑将$null = ...丢弃命令的(成功的)输出,因为它:

  • 传达意图

  • 在大多数情况下比> $null尤其是... | Out-Null都快。 [1]

适用于以上示例:

$null = cmd /c "echo hi & dir \nosuch" 2>&1

$null = bash -c 'echo hi; ls \nosuch'  2>&1

[1]在PowerShell Core 中,如果前面的唯一管道段是无副作用的 expression ,而不是Out-Null,则进行优化cmdlet或函数调用;例如1..1e6 | Out-Null几乎不会执行,因为该表达式似乎甚至没有执行。但是,这种情况是非典型的,功能上等效的Write-Output (1..1e6) | Out-Null运行时间较长,比$null = Write-Output (1..1e6)要长得多。