我正在开发一个PowerShell脚本,它将跨多个服务器执行脚本。 使用http://ps2exe.codeplex.com/
将我的脚本转换为exe后当我关闭窗口时,如果在try catch中捕获到任何错误,我会收到错误。
$ErrorActionPreference = 'Continue'
$dataAdapter = new-object System.Data.SqlClient.SqlCommand ($ExeStatement, $connString);
$dataAdapter.Connection.Open();
$dataAdapter.CommandTimeout = 65535;
Try {
$dataAdapter.ExecuteNonQuery()}
catch{
$ErrorCounter = $ErrorCounter + 1
$dataAdapter.Connection.Close();}
finally{
$dataAdapter.Connection.Close();}
如果我删除了try catch,我可以在捕获错误时关闭窗口。 如果我删除$ dataAdapter.CommandTimeout = 65535;我可以在捕获错误时关闭窗口,但我需要这个,因为其中一个脚本相当长。 如果我将ErrorActionPreference设置为STOP,它也可以正常工作。虽然我希望能够继续完成错误并在最后报告。
关闭窗口时,我从Windows中收到以下错误。
描述:停止工作
问题签名:
问题事件名称:CLR20r3
问题签名01:PROGRAMNAME.exe
问题签名02:0.0.0.0
问题签名03:53bdc0d9
问题签名04:mscorlib
问题签名05:2.0.0.0
问题签名06:5174de33
问题签名07:34a9
问题签名08:18c
问题签名09:System.IO.IOException
操作系统版本:6.1.7601.2.1.0.16.7
地区ID:1033
DefaultDataCollection失败:0x8007001f
我需要脚本能够继续执行错误,但我还需要捕获错误。
答案 0 :(得分:1)
我猜 OP 已经解决了这个问题,但是对于任何偶然发现它的人来说,可能的解决方法是他在捕获错误时尝试关闭数据适配器两次:一次在 catch 块中,一次在 finally块,但它已经在 catch 块中关闭了。
OP 指出,这仅在他出现错误时才会发生。是的,因为这是导致双重关闭的唯一条件。
简单的答案是从 catch 块中移除数据适配器 close 并让 finally 块来处理它。
答案 1 :(得分:0)
当您最终删除“'阻止并关闭连接?
try {
$dataAdapter.ExecuteNonQuery()
}
catch {
$ErrorCounter = $ErrorCounter + 1
}
$dataAdapter.Connection.Close()
或
try {
$dataAdapter.ExecuteNonQuery()
$dataAdapter.Connection.Close()
}
catch {
$ErrorCounter = $ErrorCounter + 1
}
你的exec在没有错误的情况下完成后会返回任何内容吗?也许改变它以在它完成运行时返回0或其他东西。我的猜测是适配器正在等待某些东西返回(即使它不是查询),因此如果没有错误,你永远不会到达finally块并关闭连接。