Powershell Try Catch invoke-sqlcmd



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

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

我得到以下错误:

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

我本来希望得到一行语句:"连接到服务器Localhost\fake时出错">

错误似乎被认为是非终止的,这有点奇怪。尝试使用附加参数调用SqlCommand:-ErrorAction Stop。如果错误是非终止的,这将把它转换为您可以捕获的终止错误。

@KeithHill发布额外信息以补充答案,因为这太长了,无法发表评论。

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

如果您想添加自定义错误信息并使其成为终止错误,请从捕获块中抛出如下:

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

如果希望终止按照-ErrorAction参数指定的方式进行,则可以使用Write Error。在PowerShell 4.0及以下版本中,Write Error commandlet不允许使用-Exception参数,因此不会提供InnerException。这意味着,如果调用方需要确定原始异常,则必须检查$Error系统变量中的集合。在以后的版本中,您可以在捕获块中使用Write-Error -Message "Some additional error information." -Exception $_.Exception

尝试

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并显示您的写入主机

相关内容

  • 没有找到相关文章

最新更新