Benutzer mit den meisten Antworten
Excel-Prozess nach Script beenden

Frage
-
Hallo,
Ich erstelle mir eine Excel-Instanz, über die ich mehrere Arbeitsmappen erstelle und abspeichere.
Am Ende möchte ich, dass die Excel-Instanz beendet wird.
Da auf dem System allerdings auch andere Excel-Prozesse laufen könnten, kann ich das schlecht über die Prozesse direkt machen und versuche mir damit zu helfen:
$oXls.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject( $oXls ) Remove-Variable oXls
Im Task-Manager wird der von mir gestartete Prozess allerdings nicht beendet.
Wie kann ich das ändern?
Danke!
Antworten
-
Ok, hab dann doch noch ne Lösung gefunden:
[System.GC]::Collect()
bewirkt Wunder...
- Als Antwort markiert Arne Drews Donnerstag, 14. April 2016 18:59
Alle Antworten
-
Ok, hab dann doch noch ne Lösung gefunden:
[System.GC]::Collect()
bewirkt Wunder...
- Als Antwort markiert Arne Drews Donnerstag, 14. April 2016 18:59
-
In .Net werden Variablen nicht sofort freigegeben und aufgelöst.
Dafür sorgt dann der GC (GarbageCollector => Müllsammler), der verwaiste Referenzen dann freigibt.
Dies löst vor allem Problme sog. Rekursiv-Verweise (Parent<->Child)-Referenzen.Mittels Collect wird dann der Sammelprozess gestartet.
Den Quit()-Aufruf benötigst du nicht, da er bei COM keine Wirkung hat.
ReleaseComObject() entfernt aber den Prozess dann, wenn absolut keine Verweise anderweitig mehr vorhanden sind.
Da du ja bestimmt Variablen auf Sheets, Ranges u.s.w. verwendest, halten diese alle indirekt ebenso Verweise auf Excel.Application und somit auf den Prozess.
Diese Variablen müssen ebenso auf $null gesetzt werden, damit der Referenzzähler reduziert wird.Erfolgt dies nicht, werden erst durch den GC die Referenzen dieser Objekte aufgelöst, wenn die Variablen out-of-scope sind, so dass dann erst der Prozess freigegeben wird.