30

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

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

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

svn:警告:W170000:修订版 26762 中不存在 URL 'blahblah'
svn: E200009: 无法显示所有目标的信息,因为某些目标不存在

不幸的是,这严重扰乱了我的脚本的输出。

我在做什么错,我应该如何抑制这个错误输出?

4

5 回答 5

31

如果您只想抑制标准错误,请使用

svn info $url 2>$null
于 2016-07-28T15:18:51.793 回答
30

以防万一其他人像我一样搜索类似的术语:

在我用前额撞了几个小时之后,当然我在这里发布问题后几分钟内就找到了解决方案:

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

这就像一个魅力。

于 2012-08-15T12:57:44.967 回答
6

也可以这样做:

svn info $url *> $null

请参阅在 PowerShell 中抑制控制台输出

about_Redirection

于 2014-06-20T16:35:00.307 回答
5

投票的答案对我来说会产生错误。解决方案最终如下:

cmd /c "MyProgram MyArguments 2>&1" | Out-Null
于 2016-01-15T14:45:54.807 回答
5

tl;博士

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
}

自己的答案有效地解决了重定向问题

Steven Penny 的回答提出*>$null,即抑制所有输出流作为一种方便的替代方案 - 它消除了Out-Null我通常建议替换的需要$null = ...- 请参阅此答案

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

虽然它可能适用于您的特定命令,$?但不幸的是,它并不是外部程序是否成功的可靠指标-请改为使用$LASTEXITCODE -eq 0,因为 - 由于 GitHub 上报告的 PowerShell Core 7.0.0-preview.3 的错误在这里-即使是(明确表示成功)$?也可以最终反映。$false$LASTEXITCODE0

  • 更新:如果并且当命名的 pre-v7.2实验功能PSNotApplyErrorActionToStderr成为官方功能时,此问题将消失 - 请参阅此答案以获取更多信息。

至于在你的问题中尝试了什么:

svn info $url | out-null 2>&1  # WRONG
  • 只有成功输出被发送到管道(来自外部程序的stdout输出被发送到 PowerShell 的成功输出)。

  • 重定向,例如2>&1作用于管道中的单个命令,而不是整个管道。

  • 因此,如果svn info $url产生stderr输出,它会直接打印到主机(控制台) -Out-Null永远不会看到它。

于 2019-09-11T15:04:14.743 回答