关于Internet Explorer:如何使用Try / Catch / Finally退出当前的Powershell IE COM会话

How to Quit current Powershell IE COM session using Try/Catch/Finally

希望在我的脚本结束时,在我的Finally{}语句中终止IE COM Object浏览器会话。

我认为这很简单:

1
2
3
Finally{
    $ie.Quit()
}

但事实并非如此。在脚本的这个阶段,无法访问$ie对象,并且不能对其调用任何方法。有人知道这是为什么吗?$ie对象是否超出范围?

在我的Try{}声明之前,我已经定义了$ie对象:

1
2
3
$ie = New-Object -COMObject InternetExplorer.Application

Try{...}

但在进入Try{}语句之前,我不会实际导航():

1
2
3
4
5
6
$ie = New-Object -COMObject InternetExplorer.Application

    Try{
         $ie.navigate("http://www.allregs.com/tpl/Main.aspx")

}

然后我得到了我的catch{}声明:

1
2
3
Catch{
   write-host"Exception Message: $($_.Exception.Message)" -ForegroundColor Red    
}

最后,我的Finally{}声明:

1
2
3
Finally{
    $ie.Quit() # 'can't call method on System.ComObject.' Null?
}

你知道我为什么不能在剧本的这个阶段用Quit()来处理当前的$ie过程吗?我错过什么了吗?是否有其他方法可以在不关闭所有Internet Explorer会话的情况下结束当前的Internet Explorer会话?欢迎输入。谢谢。

更新:因此,由于代码从未到达$ie实际导航和获取值的部分,因此最终似乎无法访问$ie。它只在开始时初始化。事实上,我的Invoke-Webrequest请求(登录我)似乎是启动的提示,这就是为什么调用$ie.Quit()什么都不做的原因。我现在的问题是,有没有一种方法可以关闭使用invoke webrequest启动的IE会话?-UseBasicParameter的作用是从启动时起抑制IE,但它也以奇怪的方式破坏了我的代码,因此这似乎不是一个选项。


除非catch{}块中有什么东西会在此时终止脚本/函数,否则您实际上不需要finally{}块。如果脚本/函数能够在try{}catch{}之后继续执行,那么您只需调用$ie.Quit()即可:

1
2
3
4
5
6
7
8
9
10
$ie = New-Object -COMObject InternetExplorer.Application

try {
  $ie.navigate("http://www.allregs.com/tpl/Main.aspx")
}
catch {
  Write-Host"Exception Message: $($_.Exception.Message)" -ForegroundColor Red    
}

$ie.Quit()

更新

根据问题中的附加信息,我认为try-catch最终与这里的实际问题没有任何关系,所以我想标题问题的答案是只要$ie仍然是一个有效的应用程序对象,.Quit()方法仍然可以在finally{}块中工作。