当使用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时出错”
答案 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并显示您的写主机