2010-11-15 23 views
3

J'essaie d'ajouter des éléments à une variable Powershell avec Add-Member. Je n'ai aucun problème avec l'ajout de propriétés statiques NoteProperty, et les méthodes avec ScriptMethod, comme ça:Jeu de propriétés publiques VBscript/Get équivalent dans PowerShell

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

Maintenant, je suis coincé sur ce point:

Je veux ajouter une propriété qui a un getter et un setter et fait un tas de choses via un bloc de code.

L'équivalent VBScript serait ceci:

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 

Notez que les sections de code que je dois écrire faire plus que simplement définir/obtenir la valeur, ils sont plus complexes que (définir d'autres variables connexes, accéder aux données externes, etc ...).

J'ai échoué à trouver quelque chose d'aussi simple dans PowerShell et j'ai fini par ajouter à la place 2 scriptmethods, GetItem et SetItem. Quel serait le meilleur moyen d'implémenter cette fonctionnalité get/let dans un membre d'un objet PSObject dans PowerShell?

Merci à l'avance

+1

Vous pouvez utiliser 'Add-Member' pour ajouter un' ParametrizedProperty', mais je n'ai pas réussi à trouver des exemples pour cela. La documentation est un peu rare à cet égard. – Joey

+0

Oui, la propriété paramétrée semblait être celle que je voulais, mais elle est réservée à un autre usage, car chaque test effectué produisait le même message d'erreur indiquant qu'il était impossible pour Add-Member d'ajouter un membre de type ParameterizedProperty. Le message d'erreur indique que je devrais choisir un autre MemberTyper. – Baramin

+1

Les propriétés paramétrées ne sont pas destinées à l'utilisateur final - elles sont principalement destinées à l'adaptateur COM. – x0n

Répondre

2

Vous devez ajouter -MemberType ScriptProperty et utiliser -Value et -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 

Test:

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

Il imprime:

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

Malheureusement, je ne sais pas comment faire des détenteurs de valeur interne "protégés/privés" comme la propriété note _MyProperty dans notre exemple (ou si c'est possible du tout).

MISE À JOUR: Apparemment, c'est la réponse à ce que le titre demande plus ou moins. Mais la question concerne en fait la propriété paramétrée, pas seulement les méthodes get/set implémentées via des blocs de script. Ma tentative d'utilisation de ce type de propriété (ParameterizedProperty) avec Add-Member a échoué, peut-être n'est-elle pas encore prise en charge.

+1

Merci, Roman. Malheureusement, cela n'autorise pas ce type d'accès: $ variable.MyProperty ("property1") = "value1" qui est ce que je cherche. – Baramin

+0

On dirait que j'ai répondu à une autre question. Alors @Joey a raison, il semble que vous devriez utiliser le type 'ParametrizedProperty'. –

+1

Et il semble aussi 'ParametrizedProperty' n'est pas supporté. Si j'essaye alors PS dit: "Add-Member: Impossible d'ajouter un membre avec le type" ParameterizedProperty ". Spécifiez un type différent pour le paramètre MemberTypes. "Par conséquent, vos méthodes de script GetItem' /' SetItem' sont peut-être une bonne solution. –