Pregunta

Estoy tratando de añadir elementos a una variable PowerShell con Add-Member. No tengo ningún problema añadiendo propiedades estáticas con NoteProperty, y métodos con ScriptMethod, como que:

$variable = New-Object PSObject
$variable | Add-Member NoteProperty Key "Value"
$variable | Add-Member ScriptMethod DoSomething { // code }

Ahora estoy atrapado en este:

Quiero añadir una propiedad que tiene un getter y setter y hace un montón de cosas a través del bloque de código.

El equivalente de VBScript sería la siguiente:

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

Tenga en cuenta que las secciones de código que necesito escribir hacen algo más que establecer / obtener el valor, es más complejo que el conjunto (otras variables relacionadas, acceso a datos externos, etc ...).

No pude encontrar nada tan fácil de PowerShell y terminó añadiendo 2 en lugar scriptmethods, GetItem y SetItem.

¿Cuál sería la mejor manera de poner en práctica este get / Funcionalidad dejar en un miembro de una PSObject en PowerShell?

Gracias de antemano

¿Fue útil?

Solución

Se debe añadir -MemberType ScriptProperty y el uso -Value y -SecondValue:

# 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

Prueba:

Write-Host "Original value: $($variable.MyProperty)"
$variable.MyProperty = 123
Write-Host "After assignment: $($variable.MyProperty)"

Imprime:

Getting...
Original value: 42
Setting...
Getting...
After assignment: 123

Por desgracia, no sé cómo hacer que los titulares “protegidos” / privadas internas valor, como la propiedad _MyProperty nota en nuestro ejemplo (o si es posible).

Actualizar : Al parecer es la respuesta a lo que pide más o menos el título. Pero la cuestión es en realidad acerca de la propiedad parametrizada, no sólo obtener / métodos establecidos implementadas a través de bloques de script. Mi intento de utilizar este tipo de propiedad (ParameterizedProperty) con Add-Member ha fracasado, tal vez todavía no es posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top