Como fechar corretamente o Internet Explorer quando iniciado no PowerShell?
Houve um conjunto de perguntas recentes sobre como fazer algo com o Internet Explorer via PowerShell. Todos eles contêm códigos para iniciar o IE do PowerShell como um objeto, via$ie=new-object -comobject InternetExplorer.Application
. O problema é que a maneira correta defechamento IE que consiste em chamar$ie.quit()
não funciona - primeiro, se o IE tiver mais de uma única guia aberta, o IE não será encerrado como um todo e somente a guia que corresponde ao objeto COM será fechada e, segundo, deverá ter apenas uma Na guia, a janela é fechada, mas os processos permanecem.
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
Eu tentei pesquisar os métodos sobre como fechar um processo iniciado viaNew-Object -ComObject
e descobriram o seguinte:Como se livrar de um COMObject. O exemplo desse COMObject éExcel.Application
, que de fato se comporta como pretendido - chamandoquit()
fecha a janela e executa[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex)
E se$ex
é um COMObject criado para o processo do Excel. Mas esse não é o caso do Internet Explorer.
Eu também encontrei esta pergunta:Como obter o objeto COM existente de um IE em execução que fornece código para conectar-se ao IE por meio de uma lista de janelas abertas e funciona em uma extensão do IE iniciada em outro local, mas se o objeto COM for criado via PowerShell, esse script não poderá parar completamente os processos do IE, se modificado da seguinte forma:
$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)
}
}
No caso do IE iniciado fora do PowerShell, os processos são interrompidos, mas no caso do IE iniciado no PowerShell, permanecem dois processos, e esse código relata não ter encontrado janelas do IE para alcançar objetos COM; portanto, os processos do IE ainda não podem para ser parado.
Então, como alcançar os processos do IE sem janelas aparentemente órfãos egraciosamente detê-los? Estou cienteGet-Process iexplore | Stop-Process
, mas isso interromperá todos e quaisquer IEs, não apenas aqueles iniciados pelo script, e se o script for executado como administrador ouSYSTEM
em um servidor de desktop remoto, digamos, os IEs de todos serão interrompidos.
Ambiente: SO Windows 7 x64, PowerShell 4 (instalado acima da versão PS 2), IE11 versão 11.0.9600.17691 (atualizado automaticamente). IE definido como "Abrir página inicial" ao iniciar, para que pelo menos uma guia esteja sempre aberta.