¿Cómo cerrar correctamente Internet Explorer cuando se inicia desde PowerShell?

Hubo un conjunto de preguntas recientes sobre hacer algo con Internet Explorer a través de PowerShell. Todos ellos contienen códigos para iniciar IE desde PowerShell como un objeto, a través de$ie=new-object -comobject InternetExplorer.Application. El problema es la forma correcta declausura IE que consiste en llamar$ie.quit() no funciona: primero, si ese IE hubiera tenido más de una pestaña abierta, IE no se cierra como un todo y solo la pestaña que corresponde al objeto COM está cerrada, y segundo, si solo tuviera una pestaña, la ventana se cierra pero los procesos permanecen.

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

He intentado investigar los métodos sobre cómo cerrar un proceso iniciado a través deNew-Object -ComObject, y he encontrado esto:Cómo deshacerse de un COMObject. El ejemplo de ese COMO esExcel.Application, que de hecho se comporta según lo previsto - llamandoquit() cierra la ventana y ejecuta[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) Si$ex es un COMObject creado que detiene el proceso de Excel. Pero este no es el caso con Internet Explorer.

También he encontrado esta pregunta:Cómo obtener un objeto COM existente de un IE en ejecución que proporciona código para conectarse a IE a través de una lista de ventanas abiertas, y funciona hasta cierto punto desde IE lanzado desde otro lugar, pero si el objeto COM se crea a través de PowerShell, este script no puede detener completamente los procesos de IE, si se modifica como tal:

$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)
  }
}

En el caso de que IE se inicie fuera de PowerShell, los procesos se detienen, pero en el caso de que IE se inicie dentro de PowerShell, quedan dos procesos, y este código informa que no ha encontrado ventanas de IE para alcanzar objetos COM, por lo tanto, los procesos de IE son (todavía) incapaces para ser detenido

Entonces, cómo llegar a los procesos de IE sin ventanas aparentemente huérfanos ygraciosamente ¿páralos? Estoy consciente deGet-Process iexplore | Stop-Process, pero esto detendrá todos y cada uno de los IE, no solo los lanzados por el script, y si el script se ejecuta como administrador oSYSTEM en un servidor de escritorio remoto, por ejemplo, se detendrán los IEs de todos.

Entorno: SO Windows 7 x64, PowerShell 4 (instalado arriba de PS versión 2), IE11 versión 11.0.9600.17691 (actualizado automáticamente). IE se establece en "Abrir página de inicio" al comenzar, por lo que al menos una pestaña siempre está abierta.

Respuestas a la pregunta(6)

Su respuesta a la pregunta