2017-08-04 3 views
1

PowerShellのV3 +使用して削除し、 "自分の" オブジェクト:私は対話的に使用するためのさまざまなコマンドレットsuiteableを提供するモジュールを書いて
を。私が達成しようとするのは、変数(オブジェクト)は、ユーザーにremove-variableを使用させることなく破壊されているということです。PowerShellの - ScriptProperty

例:

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

私は上記の作業を取得するために管理することができませんでした、以下のような代替アプローチも失敗しています。

$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 # :-(

お勧めはありますか?私は、ユーザーのrunspaceにもう使用できない変数があるのを防ぎたい。

+0

を、変数がスコープ外になったときに適切に割り当て解除多かれ少なかれオブジェクトではありません? –

+0

問題は、セッションが終了するまでスコープから外れることのないコマンドレットで対話的に作業している場合です。 – Joel

+2

対話的に、私はこれを行うことができないと信じていませんし、私はそれが動作する必要がある状況を考えることができるかどうか分からない、単にエラーを投げるのではなく、より有効な値。 –

答えて

1

オブジェクトの状態を、使用しないことを明確にする方法で変更する方がよいでしょう。例えば、IsValidIsOpenのような名前のプロパティを持つことができ、それを使用しようとすると例外がスローされる可能性があります。たとえオブジェクトがもはや有効でなくてもオブジェクトを参照したい場合に備えて、実際に変数を削除しないようにする方がよいでしょう。

しかし、あなたが本当にそれをしたい場合、あなたはこの試みることができる:通常の状況下では

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

さて、それを得ました。 Remove-variableは、-scope globalを追加したときに仕事をしました。 私はあなたのことを完全に理解しています。この場合、これらの「死んだ」オブジェクトへの参照は、参照の欠落よりも多くの問題を引き起こします。しかし、プロパティとのアイデアは考慮する価値がある、私はそれについて考えるだろう。 – Joel