2017-08-04 59 views
1

Powershell的V3 +删除 “自己” 的对象:
我正在写一个模块交互使用提供各种的cmdlet 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 # :-(

有什么建议吗?我想阻止用户运行空间中的变量不再可用。

+0

在正常情况下,都没有对象更多或更少的正确取消分配时,该变量超出范围? –

+0

他们会,是的,问题在于,如果您正在使用cmdlet进行交互式工作,则在会话关闭之前,它们不会超出范围。 – Joel

+2

交互式地,我不相信这是可以做到的,我不确定我能想象到我希望它能够工作的情况,而不是简单地抛出一个错误,如果我使用了一个没有约束的变量,更有效的价值。 –

回答

1

最好是改变对象的状态,使其清楚不应再被使用。例如,您可以拥有一个名为IsValidIsOpen的属性,然后如果他们尝试使用它,则可能会引发异常。如果用户想要引用对象,即使它不再有效,最好避免为用户实际删除变量。

但是,如果你真的想这样做,你可以试试这个:

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

好吧,明白了。当我添加-scope global时,Remove-Variable完成了这项工作。 我完全理解你的观点 - 在这种情况下,对这些“死”对象的引用会导致比缺少引用更多的问题。然而,与财产的想法是值得考虑的,我会考虑它。 – Joel