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
$LASTEXITCODE
0
- 更新:如果并且当命名的 pre-v7.2实验功能
PSNotApplyErrorActionToStderr
成为官方功能时,此问题将消失 - 请参阅此答案以获取更多信息。
至于你在你的问题中尝试了什么:
svn info $url | out-null 2>&1 # WRONG
只有成功输出被发送到管道(来自外部程序的stdout输出被发送到 PowerShell 的成功输出流)。
重定向,例如2>&1
作用于管道中的单个命令,而不是整个管道。
因此,如果svn info $url
产生stderr输出,它会直接打印到主机(控制台) -Out-Null
永远不会看到它。