none
Excel-Prozess nach Script beenden RRS feed

  • 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!

    Donnerstag, 14. April 2016 17:25

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
    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
    Donnerstag, 14. April 2016 18:59
  • Ich verstehe dein Problem und beim Lesen habe ich festgestellt, das ich das gleich habe.

    Was macht der Befehlt [System.GC]::Collect() eigentlich genau. Ich sehe das es funktioniert, aber was passiert da, weis das einer?

    Donnerstag, 7. Juni 2018 08:37
  • 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.

    Donnerstag, 7. Juni 2018 09:18