【发布时间】:2016-08-28 20:32:01
【问题描述】:
最近有一组关于通过 PowerShell 使用 Internet Explorer 进行操作的问题。所有这些都包含通过$ie=new-object -comobject InternetExplorer.Application 从 PowerShell 作为对象启动 IE 的代码。问题是,由调用 $ie.quit() 组成的 关闭 IE 的正确方法不起作用 - 首先,如果该 IE 碰巧有多个打开的选项卡,则 IE 不会退出作为一个整体,只有与 COM 对象对应的选项卡被关闭,其次,如果它只有一个选项卡,则窗口将关闭但进程仍然存在。
PS > get-process iexplore
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
352 31 7724 24968 142 0,58 3236 iexplore
228 24 22800 15384 156 0,19 3432 iexplore
我试图研究如何关闭通过New-Object -ComObject 启动的进程的方法,并发现:How to get rid of a COMObject。该 COMObject 的示例是 Excel.Application,它的行为确实符合预期 - 调用 quit() 使窗口关闭,如果 $ex 是已创建的 COMObject,则执行 [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) 会停止 Excel 进程。但 Internet Explorer 并非如此。
我还发现了这个问题:How to get existing COM Object of a running IE 它提供了通过打开的窗口列表连接到 IE 的代码,并且可以在从其他地方启动的 IE 的范围内工作,但是如果 COM 对象是通过 PowerShell 创建的,则此脚本是如果这样修改,则无法完全停止 IE 的进程:
$shellapp = New-Object -ComObject "Shell.Application"
$ShellWindows = $shellapp.Windows()
for ($i = 0; $i -lt $ShellWindows.Count; $i++)
{
if ($ShellWindows.Item($i).FullName -like "*iexplore.exe")
{
$ie = $ShellWindows.Item($i)
$ie.quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ie)
}
}
如果 IE 在 PowerShell 之外启动,进程会停止,但如果 IE 在 PowerShell 中启动,则保留两个进程,并且此代码报告没有找到 IE 窗口来访问 COM 对象,因此 IE 进程是 (然而)无法停止。
那么,如何访问明显孤立的无窗口 IE 进程并优雅地阻止它们?我知道Get-Process iexplore | Stop-Process,但这将停止所有IE,而不仅仅是脚本启动的IE,如果脚本以管理员身份运行或SYSTEM在远程桌面服务器上运行,每个人的IE都会停止了。
环境: 操作系统 Windows 7 x64,PowerShell 4(安装在 PS 版本 2 以上),IE11 版本 11.0.9600.17691(自动更新)。 IE 在启动时设置为“打开主页”,因此至少有一个标签始终处于打开状态。
【问题讨论】:
标签: internet-explorer powershell com