h41msh1c0r
Goto Top

Powershell Excel Process beenden mag nicht, Hintergrundinstanz bleibt bestehen

Aloa,

ich lese aus einem Berg von xlsm Files Daten aus.

Öffnen geht
Auslesen geht
Prozess beenden haperts, bleibt immer als Hintergrundprozess Instanz da

Stop-Process -ID $_.ID -force

Die ID kommt vom Get-Process Excel.

Das Ergebnis ist das der Excel Prozess noch vorhanden ist und bei mehreren 100 Dateien wird der Taskmanager irgendwann voll. =)

Auch ein :

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel)

gibt den Speicher nicht frei.

Wie bekomme ich die Hintergrund Instanz geschlossen?

VG

Content-Key: 391908

Url: https://administrator.de/contentid/391908

Printed on: April 18, 2024 at 20:04 o'clock

Mitglied: 137443
Solution 137443 Nov 07, 2018 updated at 11:28:53 (UTC)
Goto Top
Erst mal mit
$Excel.Quit()
Excel selbst korrekt schließen, dann mit
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($Excel)
Ressourcen freigeben
und noch mit
[gc]::collect()
Garbage collection durchführen. Und natürlich nicht immer neue Objekte erzeugen, sondern vorhandene wiederverwenden.

Nach dem Schließen der Powershell-Konsole wird dann auch die Instanz verschwinden.

Bitte nicht die ISE zum Testen benutzen die ist mit COM Automatisierung und Office in diverser Hinsicht Buggy!

Gruß l.
Member: H41mSh1C0R
H41mSh1C0R Nov 07, 2018 at 11:29:22 (UTC)
Goto Top
Danke sehr. =)
Mitglied: 137443
137443 Nov 07, 2018 at 11:31:17 (UTC)
Goto Top
Bidde.
Member: H41mSh1C0R
H41mSh1C0R Nov 07, 2018 updated at 12:46:52 (UTC)
Goto Top
Muss den Thread nochmal aufmachen )=.

Oben hast du geschrieben das man das Object recyclen sollte statt ständig neue Objekte anzulegen.

ergo:
#Object erstellen
$Excel = new-Object -ComObject excel.application

gci $Dir | %{

 $Pfad = $_.FullName

 #Workbook öffnen
 $workbook = $Excel.Workbooks.open($Pfad)

 ... auslese kram

write-host <wert aus dem xlsm>

} 

# Excel beerdigen
$Excel.Quit()
..ReleaseComObject...
[gc]::collect()

Mit dem Ergebnis das zwar nur noch 1 Prozess da ist allerdings kommt am Ende ein Berg von Dialogen, da in jedem xlsm eine Abfrage über Änderungen und 2 Felder auf gleichen Inhalt geprüft werden. Der 2te Dialog fragt dann ob die Änderungen gespeichert werden sollen. *gg*

Hab grad versucht die Workbooks zu schliessen mit einem force, aber das mag er nicht.
Mitglied: 137443
Solution 137443 Nov 07, 2018 updated at 12:52:56 (UTC)
Goto Top
Naja wie immer halt wie auch mit VBA mit einem
$Excel.DisplayAlerts = $false
Am Anfang und am Ende vom Skript zurückgesetzt auf $true.
Member: H41mSh1C0R
H41mSh1C0R Nov 07, 2018 updated at 12:53:55 (UTC)
Goto Top
Hatte ich gerade gefunden und auch ausprobiert, hatte aber keinen Einfluss drauf.
Mitglied: 137443
137443 Nov 07, 2018 updated at 12:55:17 (UTC)
Goto Top
Und die Workbooks natürlich immer schließen mit $workbook.Close($false).

Was für Dialoge sehen wir hier nicht ... VBA Dialoge von Makros?
Member: H41mSh1C0R
H41mSh1C0R Nov 07, 2018 at 12:59:10 (UTC)
Goto Top
*snipping --> mspaint --> quer über RDPs kopier --> hier reinstell*

pb001

pb002

Mit Workbooks.Close kommen die Dialoge sofort. =)
Mitglied: 137443
Solution 137443 Nov 07, 2018 updated at 13:02:07 (UTC)
Goto Top
Disable die Events vor dem öffnen
$Excel.EnableEvents = $false
Member: H41mSh1C0R
H41mSh1C0R Nov 07, 2018 at 13:03:59 (UTC)
Goto Top
Dat Lüppt.

*nen kühles Blondes rüberschieb*