Benutzer mit den meisten Antworten
Objekt zerstören?

Frage
-
Hallo!
Ich bastle mir gerade ein kleines Skript, bin aber noch recht
unbeschlagen in PowerShell. Im Skript erstelle ich auch Objekte mittels
"$variable1 = new-object...". Muss/kann ich diese Objekte nach der
Benutzung zerstören? Wenn ja, wie?
Oder ist das egal, wenn ich später sowieso erneut "$variable1 =
new-object..." ausführe?
Robert Riebisch
Antworten
-
Radio Eriwan würde sagen: Es kommt darauf an!
Allgemein kann man sagen das Objekte in PowerShell nicht zerstört werden müssen.
Wenn du aber eine "Verbindung" öffnest wie zb. zu einer Datenbank oder das Öffnen einer Datei (Handle) oder Session, dann sollte man sich bei dieser Verbindung auch wieder "abmelden" (open und close).
Ebenso sollten COM Objekte ActiveX oder WinApi32 wieder "zerstört werden"
Ein gutes beispiel für dieses "Höfliche" verhalten ist z.B. das erstellen einem PSsession und das schliessen dieser nach beendigung.
Dadurch werden die Recourcen wieder freigegeben (speicher + verbindung ).---------------------
Wenn du ein Objekt hast das sehr viel Speicher verbraucht z.B.
$UserListe = Import-CSV 33MillonenUser.csv,
dann kannst du den Speicher wieder freigeben in dem du folgendes machst:$UserListe = $Null oder:
Remove-Variable $UserListeBei einem erneuten zuweisen von neuem Inhalt in alte Variablen (Objekte) wird (fast) immer, das alte Objekt zerstört und ein neues Objekt mit dem selben Namen erstellt.
---------------------
Alle Objekte die du erstellst, haben einen gültigkeitsbereich (scrope).Wenn du ein Objekt innerhalb einer Funktion oder eines Skripts erstellst dann wird dieses automatisch beim verlassen des Scopes (Script/Funktion) wieder aus dem Speicher entfernt.
Innerhalb der PowerShell und Remote Sessions, hast du auch den einen Scope, den so genannten Session-state (sitzungs status). Beim verlassen der PowerShell werden die Objekte in diesem bereich ebenso Zerstört.---------------------
Hinweis:
Dadurch das PowerShell auf .NET Basiert, wird auch hier der so genannte Garbage-Collector (Müllsammler) genutzt.
Dieser gibt den Speicher eventuell nicht sofort wieder frei.---------------------
Lies bitte dazu auch die Dokumentation (in der PowerShell ISE): Erstellen von .NET und COM-Objekten (New-Object)
Get-Help Remove-Variable ;-)
Garbage-Collector- Bearbeitet Peter Kriegel Montag, 2. Januar 2012 18:40
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 5. Januar 2012 14:44
Alle Antworten
-
Radio Eriwan würde sagen: Es kommt darauf an!
Allgemein kann man sagen das Objekte in PowerShell nicht zerstört werden müssen.
Wenn du aber eine "Verbindung" öffnest wie zb. zu einer Datenbank oder das Öffnen einer Datei (Handle) oder Session, dann sollte man sich bei dieser Verbindung auch wieder "abmelden" (open und close).
Ebenso sollten COM Objekte ActiveX oder WinApi32 wieder "zerstört werden"
Ein gutes beispiel für dieses "Höfliche" verhalten ist z.B. das erstellen einem PSsession und das schliessen dieser nach beendigung.
Dadurch werden die Recourcen wieder freigegeben (speicher + verbindung ).---------------------
Wenn du ein Objekt hast das sehr viel Speicher verbraucht z.B.
$UserListe = Import-CSV 33MillonenUser.csv,
dann kannst du den Speicher wieder freigeben in dem du folgendes machst:$UserListe = $Null oder:
Remove-Variable $UserListeBei einem erneuten zuweisen von neuem Inhalt in alte Variablen (Objekte) wird (fast) immer, das alte Objekt zerstört und ein neues Objekt mit dem selben Namen erstellt.
---------------------
Alle Objekte die du erstellst, haben einen gültigkeitsbereich (scrope).Wenn du ein Objekt innerhalb einer Funktion oder eines Skripts erstellst dann wird dieses automatisch beim verlassen des Scopes (Script/Funktion) wieder aus dem Speicher entfernt.
Innerhalb der PowerShell und Remote Sessions, hast du auch den einen Scope, den so genannten Session-state (sitzungs status). Beim verlassen der PowerShell werden die Objekte in diesem bereich ebenso Zerstört.---------------------
Hinweis:
Dadurch das PowerShell auf .NET Basiert, wird auch hier der so genannte Garbage-Collector (Müllsammler) genutzt.
Dieser gibt den Speicher eventuell nicht sofort wieder frei.---------------------
Lies bitte dazu auch die Dokumentation (in der PowerShell ISE): Erstellen von .NET und COM-Objekten (New-Object)
Get-Help Remove-Variable ;-)
Garbage-Collector- Bearbeitet Peter Kriegel Montag, 2. Januar 2012 18:40
- Als Antwort markiert Denniver ReiningMVP, Moderator Donnerstag, 5. Januar 2012 14:44
-
Hallo Robert,
mache .NET Klassen stellen die Dispose() Methode zur Verfügung, um nicht verwaltete Resources von Objekten wieder frei zu geben, z.B. wenn Dateien geöffnet sind oder bei Datenbankanmeldung; auch hier schadet es nicht, wenn man diese aufruft.
Olaf Helper
* cogito ergo sum * errare humanum est * quote erat demonstrandum *
Wenn ich denke, ist das ein Fehler und das beweise ich täglich
Blog Xing -
Hallo Robert!
Ist deine Frage beantwortet?
Wan ja Markiere bitte einen (oder Mehrere) als Antwort oder als hilfreich! Danke!
Please mark helpful posts of me as helpful, and post that are the answers as answers! Thank you ;-)) Bitte markiere hilfreiche Beiträge von mir als "Hilfreich" und Beiträge die deine Frage ganz oder teilweise beantwortet haben als "Antwort". Das wäre Nett :-))