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