在自动执行某些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
不幸的是,这严重影响了我脚本的输出。
我做错了什么,我应该如何抑制此错误输出?
答案 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)
答案 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)。
Redirections,例如0
对管道中的单个命令起作用,而不是对整个管道 起作用。
因此,如果svn info $url | out-null 2>&1 # WRONG
产生 stderr 输出,它将直接打印到 host (控制台)-2>&1
从未看到它