VBscript Public Property Set / Get Äquivalent in Powershell
-
10-10-2019 - |
Frage
Ich versuche, Elemente zu einem Powershell-Variable mit Add-Member hinzuzufügen. Ich habe kein Problem Hinzufügen von statischen Eigenschaften mit Noteproperty und Methoden mit Script, wie folgt aus:
$variable = New-Object PSObject
$variable | Add-Member NoteProperty Key "Value"
$variable | Add-Member ScriptMethod DoSomething { // code }
Jetzt bin ich auf diese fest:
Ich möchte eine Eigenschaft hinzufügen, die einen Getter und einen Setter hat und tut ein paar Dinge über Code-Block.
Das VBScript äquivalent wäre dies:
Class MyClass
Public Property Get Item(name)
// Code to return the value of Item "name"
End Property
Public Property Let Item(name,value)
// Code to set the value of Item "name" to value "value"
End Property
End Class
Beachten Sie, dass die Codeabschnitte ich schreiben müssen mehr tun, als nur gesetzt / den Wert bekommen, sie sind komplexer als die (set andere ähnliche Variablen, Zugriff externer Daten, etc ...).
ich nicht alles so einfach in Powershell zu finden und am Ende Zugabe statt 2 scriptmethods, GetItem und SetItem.
Was ist der beste Weg wäre, diese get / lassen functionnality in einem Mitglied einer PSObject in Powershell zu implementieren?
Vielen Dank im Voraus
Lösung
Sie sollten -MemberType ScriptProperty
und Verwendung -Value
und -SecondValue
hinzufügen:
# Make an object with the script property MyProperty
$variable = New-Object PSObject
# “internal” value holder
$variable | Add-Member -MemberType NoteProperty _MyProperty -Value 42
# get/set methods
$get = {
Write-Host "Getting..."
$this._MyProperty
}
$set = {
Write-Host "Setting..."
$this._MyProperty = $args[0]
}
# the script property
$variable | Add-Member -MemberType ScriptProperty MyProperty -Value $get -SecondValue $set
Test:
Write-Host "Original value: $($variable.MyProperty)"
$variable.MyProperty = 123
Write-Host "After assignment: $($variable.MyProperty)"
Es druckt:
Getting...
Original value: 42
Setting...
Getting...
After assignment: 123
Leider weiß ich nicht, wie „geschützte / private“ inneren Wert Inhaber wie die Note Eigenschaft _MyProperty
in unserem Beispiel zu machen (oder ob es möglich ist, überhaupt).
UPDATE : Offenbar ist es die Antwort auf das, was mehr oder weniger der Titel fragt. Aber die Frage ist in der Tat über parametrisierte Eigenschaft, nicht nur erhalten / Set-Methoden über Skriptblocks implementiert. Mein Versuch, diese Art von Eigentum zu verwenden (ParameterizedProperty
) mit Add-Member
ausgefallen ist, vielleicht ist es noch nicht unterstützt.