2017-08-04 58 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