Domanda

sto cercando di aggiungere elementi ad una variabile PowerShell con Add-Member. Non ho alcun problema aggiungendo proprietà statiche con NoteProperty, e metodi con ScriptMethod, così:

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

Ora mi sono bloccato su questo:

Voglio aggiungere una proprietà che ha un getter e setter e fa un sacco di cose tramite blocco di codice.

L'equivalente VBScript sarebbe questo:

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

Si noti che le sezioni di codice ho bisogno di scrivere fare di più che semplicemente impostare / ottenere il valore, sono più complesso di quello (stabilite altre variabili correlate, di accesso ai dati esterni, ecc ...).

non sono riuscito a trovare nulla di questo facile in PowerShell e ha finito per l'aggiunta di 2 invece scriptmethods, GetItem e SetItem.

Quale sarebbe il modo migliore per attuare questo get / lasciare functionnality in un membro di un PSObject in PowerShell?

Grazie in anticipo

È stato utile?

Soluzione

Si dovrebbe aggiungere -MemberType ScriptProperty e l'uso -Value e -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

Prova:

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

Esso stampa:

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

Purtroppo non so come fare “protette / privati” titolari valore interno, come la proprietà _MyProperty nota nel nostro esempio (o se è possibile a tutti).

Aggiorna : A quanto pare è la risposta a quello che, più o meno il titolo chiede. Ma la questione è in realtà sulla proprietà con parametri, non solo ottenere / metodi di implementati tramite blocchi di script. Il mio tentativo di utilizzare questo tipo di proprietà (ParameterizedProperty) con Add-Member ha fallito, forse non è ancora supportato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top