我正在使用一个包装器脚本,该脚本调用一个函数来查询指定服务器中的某些数据库,并将元数据插入到单独服务器上的特定数据库中。我使用$ error.count变量来确定脚本是否成功。我预计会发生一些允许/提取错误,并希望捕获和忽略这些错误($ error.count变量没有增加,但在作业日志中写了警告)。我可以确认一个权限错误正在发生并正在被正确捕获。 $ error.count变量没有增加,但是从显示无法访问的数据库的catch中打印出警告。
我的问题在提取/插入功能完成运行后发生。在此函数返回到包装器脚本之后,我立即再次打印$ error.count变量。这一次,它返回一个1,好像先前捕获的错误级联到包装器脚本中一样。正如我之前提到的,我不希望将其包含在错误计数中。我不确定$ error.count是如何或为什么从这个函数增加的。
我应该使用不同的变量来确定脚本是否“失败”?是否有一些潜在的原因导致$ error.count会在出现错误的函数之外增加,而在捕获错误后不会增加?关于这个问题的任何指导都将不胜感激。
参考代码: 包装功能:
$errorCount = $error.count
Write-Warning ("$errorCount Before function")
Extraction/Insertion_Function -serverList $serverList -insertionDB $insertionDB -ErrorAction SilentlyContinue
$errorCount = $error.count
Write-Warning ("$errorCount After function")
} catch {
Write-Error "Error caught by wrapper: $_"
}
提取/ Insertion_Function:
ForEach ($db in $dbList) {
Write-Warning "$errorCount database
.
.
.
try {
$totalProperties = Get-ServerDBMetadata -DBConnectionString ($connStr) -DatabaseName $dbName -EA SilentlyContinue
} catch {
Write-Warning "Unable to extract metadata from $dbname in $server"
}
}
然后我在循环内部打印错误计数,从每个数据库中提取/插入元数据到插入数据库,以及包含数据库的每个服务器的循环:
WARNING: 0 Before function
WARNING: 0 database
.
.
.
WARNING: 0 database
WARNING: Unable to extract metadata from *database* in *server*
WARNING: 0 database
.
.
.
WARNING: 0 database
**WARNING: 1 After function**
错误(权限问题)被捕获到函数内部,但是级联到我的包装器脚本。我希望忽略这个特定的错误,而不是忽略其他更严重的错误(比如无法连接到我正在插入元数据的服务器),因此在包装器脚本内的驱动程序函数上放置-EA Ignore是不合适的问题
答案 0 :(得分:2)
try-catch没有捕获错误的主要问题(即使您没有提供所有代码)是您的cmdlet显式调用-ErrorAction SilentlyContinue
。 Try / Catch块请求终止错误的使用,因此对于function / cmdlet,您需要更改为-ErrorAction Stop
for try / catch以正确处理该函数/ cmdlet中的错误。
这需要针对我们看不到的代码中的任何其他函数/ cmdlet进行更新。
以下评论中描述的编辑:
$n = New-Object PSObject -property @{
'Test1' = ''
'Test2' = ''
'Test3' = ''
}
try {
get-process someprocess -ErrorAction Stop
$n.Test1 = $true
} catch {
$n.Test1 = $false
}
try {
Get-WmiObject win32_computersystem -ErrorAction Stop
$n.Test2 = $true
} catch {
$n.Test2 = $false
}
try {
Get-Content somefile.ext -ErrorAction Stop
$n.Test3 = $true
} catch {
$n.Test3 = $false
}
if ($n.Test1 -and $n.Test2 -and $n.Test3) {
## All procedures completed successfully -- do something magical
} else {
## At least one test procedure failed.
}
答案 1 :(得分:2)
将SilentlyContinue
替换为Ignore
以忽略错误,并且不会增加计数。
Extraction/Insertion_Function -serverList $serverList -insertionDB $insertionDB -ErrorAction Ignore
要在函数内部捕获它,请使用-ErrorAction Stop
,因为在try3r的答案中,try / catch语句只捕获终止错误。
答案 2 :(得分:1)
记录自上次日志以来的剩余错误:
While ($Global:ErrorCount -lt $Error.Count) {
$Err = $Error[$Error.Count - ++$Global:ErrorCount]
$ErrLine = "Error at $($Err.InvocationInfo.ScriptLineNumber),$($Err.InvocationInfo.OffsetInLine): $Err"
Write-Host $ErrLine -ForegroundColor Red # Log this
}