2017-08-04 6 views
1

Powershell V3 +:
ich ein Modul bietet verschiedene Cmdlets geeignet für interaktive Nutzung hier schreibe. Ich versuche zu erreichen, dass Variablen (Objekte) zerstört werden, ohne dass der Benutzer remove-variable verwenden muss.Powershell - Entfernen „eigenes“ Objekt mit Script

Beispiel:

$object = open-object -someparam 
$object # returns something 
close-object -reference $object 
$object # is not defined anymore - similiar to remove-variable 

ich nicht die oben arbeiten, alternative Ansätze wie die unten auch versäumt haben, verwalten könnte zu erhalten.

$x = New-Object -TypeName PSCustomObject 
$x | Add-Member -type NoteProperty -Name Justsomedata -Value Nomeaning 
$x | Add-Member -type ScriptMethod -Name killme -Value { $this = $null } 
$x 
$x.killme() 
$x # :-(

Irgendwelche Vorschläge? Ich möchte verhindern, dass es Variablen im User-Runspace gibt, die nicht mehr nutzbar sind.

+0

Unter normalen Umständen sind nicht die Objekte mehr oder weniger richtig de-zugewiesen, wenn die Variable den Gültigkeitsbereich verlässt ? –

+0

Sie würden, ja, das Problem ist, wenn Sie interaktiv mit den Cmdlets arbeiten sie nicht aus dem Geltungsbereich gehen, bis die Sitzung geschlossen wird. – Joel

+2

Interaktiv glaube ich nicht, dass dies getan werden kann, und ich bin mir nicht sicher, ob ich mir eine Situation vorstellen kann, in der ich _wollte_ es funktionieren würde, anstatt einfach einen Fehler zu werfen, wenn ich eine Variable verwende, die ein Nein hat. länger gültiger Wert –

Antwort

1

Es wäre besser, den Zustand des Objekts so zu ändern, dass klar ist, dass es nicht mehr verwendet werden sollte. Zum Beispiel könnten Sie eine Eigenschaft namens IsValid oder IsOpen haben und dann könnten Sie eine Ausnahme auslösen, wenn sie versucht haben, sie zu verwenden. Es ist besser zu vermeiden, dass tatsächlich Variablen für den Benutzer entfernt werden, falls sie auf das Objekt verweisen möchten, auch wenn es nicht mehr gültig ist.

Aber, wenn Sie es wirklich tun wollen, können Sie dies versuchen:

$references = Get-Variable | Where-Object { $this -eq $_.Value} 
$references | ForEach-Object { Remove-Variable $_.Name } 
+0

Okay, verstanden. Remove-Variable hat den Job ausgeführt, als ich -scope global hinzugefügt habe. Ich verstehe Ihren Punkt völlig - in diesem Fall würden Verweise auf diese "toten" Objekte mehr Probleme als fehlende Referenzen verursachen. Die Idee mit der Immobilie ist jedoch eine Überlegung wert, ich werde darüber nachdenken. – Joel