2013-05-15 3 views
1

J'ai travaillé sur un code PowerShell et en essayant de le rendre aussi lisible que possible (quelque chose PS est très agréable à). Bien que nous ayons une fonction Add-Member et une fonction Get-Member, il n'y a pas de fonction Set-Member associée. Donc, je suis allé environ en créer un pour mon projet. Cependant, dans la fonction elle-même (comme indiqué ci-dessous), il me exige d'utiliser la ligne:

$_.$NotePropertyName = $NotePropertyValue 

à travailler, mais je pense que je devrais utiliser la ligne mais il ne fonctionne pas:

$InputObject.$NotePropertyName = $NotePropertyValue 

Quelqu'un peut-il m'aider à comprendre pourquoi il réagit de cette façon? Merci!

Function Set-Member 
{ 
    [CmdletBinding(DefaultParameterSetName='Message')] 
param(
    [Parameter(ParameterSetName='Message', Position=0, ValueFromPipeline=$true)] [object[]]$InputObject, 
    [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyName, 
     [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyValue 
) 
$strInitialValue = $InputObject.($NotePropertyName) #Get the value of the property FirstName for the current object in the pipe 
$_.$NotePropertyName = $NotePropertyValue 
} 


$objTest = [PSCustomObject]@{ 
    FirstName = "Bob" 
    LastName = "White" 
} 

$objTest | ForEach-Object { 
    $_ | Set-Member -NotePropertyName "FirstName" -NotePropertyValue "Joe" 
    $_  #Push the object back out the pipe 
} 

$objTest | ForEach-Object { 
    $_ | Set-Member -NotePropertyName "FirstName" -NotePropertyValue "Bobby$($_.FirstName)" 
    $_  #Push the object back out the pipe 
} 
+0

Je suis désolé. mais je ne comprends vraiment pas quel est le but de cette fonction –

+1

Hey CB .... C'est vraiment juste pour ceux qui lisent mon code en interne voir le verbiage "Set-Member" pour le rendre très clair ce qu'il fait. Mon code actuel fait juste le changement de ligne et a du sens pour moi, mais je pensais que pour l'avenir, il serait bien d'avoir une cmdlet nommée. –

Répondre

3

Vous avez défini le paramètre $ InputObject en tant que tableau d'objets. Vous devriez avoir une boucle for dans votre fonction pour parcourir le tableau et ne pas le traiter comme un seul objet. Ou changez le type en [object] au lieu de [object[]].

Étant donné que vous utilisez un pipeline pour appeler la fonction, vous devez utiliser le process block of the function ou vous ne verrez que le dernier élément traité dans le pipeline.

Function Set-Member 
{ 
    [CmdletBinding(DefaultParameterSetName='Message')] 
param(
    [Parameter(ParameterSetName='Message', Position=0, ValueFromPipeline=$true)] [object[]]$InputObject, 
    [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyName, 
     [Parameter(ParameterSetName='Message', Mandatory=$true)] [string]$NotePropertyValue 
) 
process 
    { 
    foreach ($obj in $InputObject) 
    { 
     $strInitialValue = $obj.($NotePropertyName) #Get the value of the property FirstName for the current object in the pipe 
     $obj.$NotePropertyName = $NotePropertyValue 
    } 
    } 
} 
+0

Lars, merci beaucoup. Cela l'a réparé. Je ne visais vraiment qu'un seul objet, alors j'ai pris votre code et j'ai enlevé le [] et j'ai sorti la boucle foreach. Je vous remercie également pour la note sur le bloc de processus car je n'étais pas au courant de cette mise en garde. Bonne chance! –