Powershell尝试Catch invoke-sqlcmd

时间:2012-11-28 17:08:19

标签: powershell try-catch try-catch-finally

当使用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时出错”

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:2)

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

如果错误记录是由Write-Error命令行开关创建的,则它是非终止的,并且受-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系统变量中的集合。在以后的版本中,您可以在catch块中使用Write-Error -Message "Some additional error information." -Exception $_.Exception

答案 2 :(得分:-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并显示您的写主机