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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top