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 -ComObjecte 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.

questionAnswers(6)

yourAnswerToTheQuestion