如何在PowerShell中抑制标准错误输出?

时间:2012-08-15 12:51:53

标签: svn powershell io-redirection

在自动执行某些SVN任务的PowerShell脚本中,我有以下功能:

function SvnUrlExists($url)
{
  svn info $url | out-null 2>&1
  return $?
}

由于这显式测试是否存在某个SVN存储库URL,因此我对任何错误输出都不感兴趣。但是,尽管我发现有关在PowerShell中重定向stderr的所有内容都建议2>&1将其重定向到stdout 仍然会输出错误消息

svn: warning: W170000: URL 'blahblah' non-existent in revision 26762
svn: E200009: Could not display info for all targets because some targets don't exist

不幸的是,这严重影响了我脚本的输出。

我做错了什么,我应该如何抑制此错误输出?

5 个答案:

答案 0 :(得分:18)

以防其他人谷歌搜索类似的条款:

在我对我的前额进行了几个小时的撞击之后,当然我在发布问题后的几分钟内找到了解决方案:

svn info $url 2>&1 | out-null

这就像一个魅力。

答案 1 :(得分:12)

如果您想要禁止标准错误,请使用:

svn info $url 2>$null

答案 2 :(得分:3)

投票的答案会给我带来错误。解决方案最终得到以下结论:

cmd /c "MyProgram MyArguments 2>&1" | Out-Null

答案 3 :(得分:2)

也可以这样做:

svn info $url *> $null

请参阅 Suppress console output in PowerShell

about_Redirection

答案 4 :(得分:1)

tl; dr

function SvnUrlExists($url)
{

  # Suppress all output streams (external stdout and stderr in this case)
  # To suppress stderr output only, use 2>$null
  svn info $url *>$null 

  # For predictable results with external programs, 
  # infer success from the *process exit code*, not from the automatic $? variable.
  # See https://github.com/PowerShell/PowerShell/issues/10512
  $LASTEXITCODE -eq 0
}

您的own answer有效地解决了重定向问题

Steven Penny's answer提出了*>$null,即取消 all 输出流是一种方便的选择-消除了对Out-Null的需求,我通常建议将其替换为{ {1}}-参见this answer

但是,您的问题中的代码还有另一个问题

$null = ...虽然可以与您的特定命令一起使用,但不是是外部程序是否成功的有力指标-改用$? ,因为-由于自PowerShell Core 7.0.0-preview.3起的一个错误,在GitHub here上报告-$LASTEXITCODE -eq 0最终可以反映出{即使$?$false(明确表示成功),也要{1}}。


关于您尝试过的问题

$LASTEXITCODE
  • 成功输出发送到管道(外部程序的 stdout 输出发送到PowerShell的成功输出stream)。

  • p>
  • Redirections,例如0对管道中的单个命令起作用,而不是对整个管道 起作用。

  • 因此,如果svn info $url | out-null 2>&1 # WRONG 产生 stderr 输出,它将直接打印到 host (控制台)-2>&1从未看到它