PowerShell try-catch 未捕获 Invoke-sqlcmd 错误



我有一个函数,我将服务器名称传递给它,然后从该服务器中选择一些数据并将其插入到集中式服务器上的表中。 服务器列表是从并不总是最新的集中式服务器生成的,我希望它继续处理并记录发生的任何错误。 但是,我的 try-catch 块似乎没有捕获任何错误。

我看到了这个问题并尝试了一下,但我仍然无法捕获错误。 这是我函数的通用版本:

function Get-QueryData
{
[CmdletBinding()]
param 
(
[string] $server
)
$QuerySelect = "select * from dbo.Table"
try
{
$results = Invoke-Sqlcmd -ServerInstance $server `
-Database TheDatabase `
-Query $QuerySelect `
-QueryTimeout 20 `
-OutputSqlErrors $True `
-ConnectionTimeout 5 `
-ErrorAction Stop
}
catch
{
#to-do: log error
Write Host "    An error occurred trying to get query info"
}
#  remaining function inserts into central server, this part doesn't fail
#  unless the first part fails
}

我得到的错误:

Invoke-Sqlcmd:发生与网络相关或特定于实例的错误 在建立与 SQL 服务器的连接时...分类信息: InvalidOperations (:) [Invoke-SqlCmd] SqlException FullQualifiedErrorId : SqlExecutionError,Microsoft.SqlServer.Management.Powershell.GetScriptCommand


我收到此错误的原因是服务器已启动,然后必须重建,但它已经添加到我们的中央管理服务器中。 我不能指望立即清理它,所以我需要电源外壳来记录错误并继续前进。


$PsVersionTable.PSVersion 的输出

专业 - 5

次要 - 1

内部版本 - 14409

修订版 - 1012

  • Try{}集合中$flag=$True
  • Try{}从 get-sqlcmd 中删除$results变量
  • Catch{}设置$flag=$false
  • 添加检查标志的finally{}
  • Finally{}中添加if(!x){y}else{z}
  • Finally{if(!x){y}else{z}}
  • 如果$flag$false写入日志并退出
  • 如果$flag$true请完成您的工作,然后写入日志

我提供了简单日志记录[sting]$message >> $targetFile。有更好的方法来进行日志记录,我仅将此示例用作简单示例,而不是建议。

function Get-QueryData 
{
[CmdletBinding()]
param(
[string] $server
)
$QuerySelect = "select * from dbo.Table"
try
{
$flag = $true
Invoke-Sqlcmd -ServerInstance $server `
-Database TheDatabase `
-Query $QuerySelect `
-QueryTimeout 20 `
-OutputSqlErrors $True `
-ConnectionTimeout 5 `
-ErrorAction Stop
}
catch
{
$flag = $false
#to-do: log error with $_ which contains the error object
Write-Host "An error occurred trying to get query info"
$errorMessage = $_.Exception.Message
}
finaly
{
# log errors if flag false
if (!$flag){
"[$(get-date)] - $errorMessage" >> `
$(some target accessible path to a writable file)
#Stop the function and return an exit code of 1
Return 1            
} else {
#  remaining function inserts into central server
"[$(get-date)] - Short Meaningful Success Message" >> `
$(some target accessible path to a writable file)          
}
}
}

所以我是个白痴,我是从过时的副本复制的。 我的新版本反映了根据我问题中的链接所做的更改,效果很好。

相关内容

最新更新