调用用户定义的函数时无法捕获 Powershell 中的非终止错误
unable to catch non terminating errors in powershell when calling user defined function
我有一个连接到数据库并执行查询的用户定义函数,它将在循环中调用以在多个数据库上执行。如果数据库服务器报告了任何错误,脚本会在控制台上报告错误并继续执行而不会终止,这是预期的。但是我想将该错误保存到一个变量中,并将其写入文件或保存到数据库中。
下面是示例代码:(不完整...)
function sqlCon($db, $sqlcmd)
{
$connString = "Server='server_name';Database='$db';Integrated Security=sspi"
$sqlConnect = New-Object System.Data.SqlClient.SqlConnection $connString
$sqlConnect.Open()
$sqlCommand = $sqlConnect.CreateCommand()
$sqlCommand.CommandText = $sqlcmd
$sqlCommand.ExecuteNonQuery() | Out-Null
$sqlConnect.Close()
}
}
foreach($db in $databases){
try{
$sqlcmd = " use $($db);
<<some sql query which updates or deletes>>"
sqlCon $db $sqlcmd
#here i'm trying to catch non terminating errors but below statment never satisfies even
#i have errors while calling above function. Not sure if i'm missing anything here...
if(-not($?)){
throw "an error occured while executing query on $($db)."
}
}
catch{
write-host "use this info to log into file or database."
}
}
注意:我使用的是 powershell V2,但 powershell V3 中的任何选项也适用于我。
在sqlCon
函数中添加一个CmdletBinding
attribute并使用-ErrorVariable
公共参数:
function sqlCon
{
[CmdletBinding()]
param([string]$db, [string]$sqlcmd)
# ...
}
foreach($db in $databases){
sqlCon -db $db -sqlcmd $sqlcmd -ErrorVariable sqlErrors
if($sqlErrors.Count -gt 0){
# nonterminating errors were written, log items in $sqlErrors here
}
}
我有一个连接到数据库并执行查询的用户定义函数,它将在循环中调用以在多个数据库上执行。如果数据库服务器报告了任何错误,脚本会在控制台上报告错误并继续执行而不会终止,这是预期的。但是我想将该错误保存到一个变量中,并将其写入文件或保存到数据库中。
下面是示例代码:(不完整...)
function sqlCon($db, $sqlcmd)
{
$connString = "Server='server_name';Database='$db';Integrated Security=sspi"
$sqlConnect = New-Object System.Data.SqlClient.SqlConnection $connString
$sqlConnect.Open()
$sqlCommand = $sqlConnect.CreateCommand()
$sqlCommand.CommandText = $sqlcmd
$sqlCommand.ExecuteNonQuery() | Out-Null
$sqlConnect.Close()
}
}
foreach($db in $databases){
try{
$sqlcmd = " use $($db);
<<some sql query which updates or deletes>>"
sqlCon $db $sqlcmd
#here i'm trying to catch non terminating errors but below statment never satisfies even
#i have errors while calling above function. Not sure if i'm missing anything here...
if(-not($?)){
throw "an error occured while executing query on $($db)."
}
}
catch{
write-host "use this info to log into file or database."
}
}
注意:我使用的是 powershell V2,但 powershell V3 中的任何选项也适用于我。
在sqlCon
函数中添加一个CmdletBinding
attribute并使用-ErrorVariable
公共参数:
function sqlCon
{
[CmdletBinding()]
param([string]$db, [string]$sqlcmd)
# ...
}
foreach($db in $databases){
sqlCon -db $db -sqlcmd $sqlcmd -ErrorVariable sqlErrors
if($sqlErrors.Count -gt 0){
# nonterminating errors were written, log items in $sqlErrors here
}
}