9

当使用 Invoke-Sqlcmd 连接到 SQL Server 失败时,我在 PowerShell 中捕获错误时遇到问题。这是一些用于演示该问题的通用代码:

CLS
$server = "Localhost\fake"
try
{
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
}
catch
{
    Write-Host "Error connecting to server " $server
}

我收到以下错误:

Invoke-Sqlcmd:建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)

我期待得到一行语句:“连接到服务器 Localhost\fake 时出错”

4

3 回答 3

17

看起来错误被认为是非终止的,这有点奇怪。尝试使用附加参数的 Invoke-SqlCommand -ErrorAction Stop:. 如果存在非终止错误,这会将其转换为您可以捕获的终止错误。

于 2012-11-28T17:13:31.967 回答
3

发布附加信息以补充@KeithHill 的答案作为答案,因为评论太长了。

如果错误记录是由 Write-Error commandlet 创建的,则它是非终止的,并且受 -ErrorAction 参数或 $ErrorActionPreference 系统变量指定的行为的影响。使用 throw 的错误正在终止。请参阅有关Write-Error的文档(请注意,PowerShell 4.0 及以下版本没有网页中提到的 -Exception 参数。)和PowerShell 帮助系统中的about_Throw 。

如果要添加自定义错误信息并使其成为终止错误,请从 catch 块中抛出,如下所示:

catch
{
    throw (New-Object System.Exception "Error connecting to server $($server).", $_.Exception)
}

如果您希望终止的行为与 -ErrorAction 参数指定的一样,则可以使用 Write-Error。在 PowerShell 4.0 及更低版本中,Write-Error 命令行开关不允许使用 -Exception 参数,因此不会提供 InnerException。这意味着调用者如果需要确定原始异常,则必须检查 $Error 系统变量中的集合。在以后的版本中,您可以Write-Error -Message "Some additional error information." -Exception $_.Exception在 catch 块中使用。

于 2017-06-12T20:50:29.563 回答
-2

尝试

CLS
$server = "Localhost/fake"
try
{
    Invoke-Sqlcmd -Query "SELECT DB_NAME() as [Database]" -Server $server
}
catch
{
    $_ | Out-Null
    Write-Host "Error connecting to server " $server
}

这将捕获错误并将其重定向到 null 并显示您的写入主机

于 2012-11-28T17:17:58.003 回答