2009-09-05 9 views
4

J'essaie d'utiliser le cmd PowerShell Add-Member sur tous les éléments d'un tableau, puis accéder au membre que j'ai ajouté plus tard, mais il n'apparaît pas.PowerShell Ajouter un membre aux éléments du tableau

Vous pouvez voir dans le résultat du code ci-dessous que le NoteProperty semble exister dans la portée de l'instruction foreach mais il n'existe pas sur le même objet en dehors de cette portée.

N'importe quel moyen pour que ce script affiche isPrime sur les deux appels à Get-Member?

$p = @(1) 
$p[0] | %{ add-member -inputobject $_ -membertype noteproperty -name isPrime -value $true; $_ | gm } 
$p[0] | gm 

sortie

TypeName: System.Int32 

Name  MemberType 
----  ---------- 
CompareTo Method  
Equals  Method  
GetHashCode Method  
GetType  Method  
GetTypeCode Method  
ToString Method  
isPrime  NoteProperty 


CompareTo Method  
Equals  Method  
GetHashCode Method  
GetType  Method  
GetTypeCode Method  
ToString Method 

Répondre

5

Le problème que vous utilisez en est que 1, un nombre entier, est un type de valeur dans .NET et lorsqu'elle est passée autour d'elle est copiée (passage par valeur). Vous avez donc modifié avec succès une copie de 1 mais pas celle d'origine dans le tableau. Vous pouvez le voir si vous Box (ou cast) le 1 à un objet (type de référence), par exemple:

$p = @([psobject]1) 
$p[0] | %{ add-member NoteProperty isPrime $true; $_ | gm } 
$p[0] | gm 

OP (spoon16) Réponse

Voici comment mon code dans mon script réellement terminé en regardant. Si cela peut être optimisé, n'hésitez pas à modifier.

$p = @() #declare array 
2..$n | %{ $p += [psobject] $_ } #initialize 
$p | add-member -membertype noteproperty -name isPrime -value $true 
+0

bonne réponse et agréable KTM –

+0

Merci! KTMs et Moab (où ça a été pris) vont très bien ensemble. :-) –

2

j'optimiser, en tapant moins:

$p | add-member noteproperty isPrime $true 
+0

merci! –

Questions connexes