我有一个函数,我将服务器名称传递给,然后从该服务器中选择一些数据并将其插入到集中式服务器上的表中。服务器列表是从一个并不总是最新的集中式服务器生成的,我希望它能够继续处理并记录发生的任何错误。但是,我的try-catch块似乎没有捕获任何错误。
我看到this question并尝试过,我仍然无法捕获错误。这是我的函数的通用版本:
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 Server的连接... CategoryInfo: InvalidOperations(:) [Invoke-SqlCmd] SqlException FullQualifiedErrorId: SqlExecutionError,Microsoft.SqlServer.Management.Powershell.GetScriptCommand
我收到此错误的原因是服务器已经站起来,然后必须重建,但它已经添加到我们的中央管理服务器。我不能立即依赖这个被清理的所以我需要powershell来记录错误并继续移动。
$ PsVersionTable.PSVersion
的输出少校 - 5
轻微 - 1
Build - 14409
修订版 - 1012
答案 0 :(得分:1)
Try{}
集$flag=$True
Try{}
中从get-sqlcmd 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)
}
}
}
答案 1 :(得分:0)
所以我是个白痴,我正在复制过时的副本。我的新版本反映了我在问题中根据链接所做的更改。