Wie kann ich den Internet Explorer beim Start von PowerShell ordnungsgemäß schließen?

Es gab eine Reihe kürzlich gestellter Fragen zu Aktionen mit Internet Explorer über PowerShell. Alle enthalten Codes zum Starten des IE aus PowerShell als Objekt über$ie=new-object -comobject InternetExplorer.Application. Das Problem ist, der richtige Weg vonSchließe IE, der aus dem Aufrufen von @ beste$ie.quit() funktioniert nicht - erstens, wenn der IE mehr als eine einzige offene Registerkarte gehabt hätte, wird der IE nicht als Ganzes beendet und nur die Registerkarte, die dem COM-Objekt entspricht, wird geschlossen, und zweitens sollte es nur eine haben eine Registerkarte, das Fenster wird geschlossen, aber die Prozesse bleiben.

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

Ich habe versucht, die Methoden zum Schließen eines über @ gestarteten Prozesses zu untersucheNew-Object -ComObject, und haben dies gefunden:Wie man ein COMObject loswird. Das Beispiel für dieses COMObject istExcel.Application, das sich in der Tat wie beabsichtigt verhält - Aufruf vonquit() schließt das Fenster und führt @ a[System.Runtime.Interopservices.Marshal]::ReleaseComObject($ex) wenn$ex ist ein erstelltes COMObject stoppt den Excel-Prozess. Bei Internet Explorer ist dies jedoch nicht der Fall.

Ich habe auch diese Frage gefunden:ie erhält man ein bestehendes COM-Objekt eines laufenden I, das Code zum Herstellen einer Verbindung mit dem IE über eine Liste geöffneter Fenster bereitstellt und in einem Umfang funktioniert, der von einem anderen Ort aus gestartet wurde. Wenn das COM-Objekt jedoch über PowerShell erstellt wird, kann dieses Skript die IE-Prozesse nicht vollständig stoppen, wenn es als solches geändert wird :

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

Bei einem IE, der außerhalb von PowerShell gestartet wird, werden die Prozesse gestoppt. Bei einem IE, der in PowerShell gestartet wird, bleiben jedoch zwei Prozesse übrig. In diesem Code wird angegeben, dass (noch) keine IE-Fenster zum Erreichen von COM-Objekten gefunden wurden. IE-Prozesse sind daher (noch) kann nicht gestoppt werden.

So, wie man die scheinbar verwaisten fensterlosen IE-Prozesse erreicht undanmuti Stoppe sie? Ich bin mir bewusst, dassGet-Process iexplore | Stop-Process, aber dies stoppt alle IEs, nicht nur die vom Skript gestarteten, und wenn das Skript als Administrator oder @ ausgeführt wiSYSTEM Auf einem Remotedesktopserver werden beispielsweise alle IEs gestoppt.

Umwelt: Betriebssystem Windows 7 x64, PowerShell 4 (installiert über PS Version 2), IE11 Version 11.0.9600.17691 (automatisch aktualisiert). IE wird beim Start auf "Homepage öffnen" gesetzt, sodass immer mindestens ein Tab geöffnet ist.

Antworten auf die Frage(12)

Ihre Antwort auf die Frage