web-dev-qa-db-fra.com

Comment ajouter des propriétés à un objet PowerShell à partir d'un tableau

J'ai un tableau à deux dimensions de noms de propriétés et de valeurs que je dois ajouter à un objet PowerShell.

Je n'ai AUCUN problème pour créer et afficher un objet comme celui-ci en utilisant New-Object et Add-Member :

$obj = New-Object PSObject
$obj | Add-Member NoteProperty IName($fiel.IName)
$obj | Add-Member NoteProperty SName($fiel.SName)
$obj | Add-Member NoteProperty Taggy($fiel.Taggy)
$obj | Add-Member NoteProperty Title($fiel.Title)

Write-Output $obj

Enter image description here

Mais quand j'essaie quelque chose comme ça:

for ($k=0; $k -lt $fieldsArray.Count; $k++)
{
    $itemobj | Add-Member –MemberType NoteProperty –Name $fieldsArray[$k].InternalName –Value $itemki[$j][$fieldsArray[$k].InternalName]
    #Write-Host $k
    #Write-Host $fieldsArray[$k].InternalName.ToString()
    #Write-Host $itemki[$j][$fieldsArray[$k].InternalName]
}

Write-Output $itemobj

Itemobj $ Write-Output $ renverra un seul membre de propriété qui doit être ajouté sans aucun nom de colonne net. 
Les parties commentées ont été ajoutées à des fins de test et renvoient des valeurs correctes pour tous les éléments.

J'ai aussi essayé

$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName)

sans aucune amélioration.

Pourquoi les autres membres de la propriété ne sont-ils pas ajoutés?

J'ai les données dont j'ai besoin. Si j'écris:

for ($k=0; $k -lt $fieldsArray.Count; $k++)
{
    Write-Host $k
    Write-Host $fieldsArray[$k].InternalName.ToString()
    Write-Host $itemki[$j][$fieldsArray[$k].InternalName]
}

Je reçois:

0 ID 1 
1 ContentTypeId 0x0108007345CD807822EA4E85691E5C642F3A27 
2 ContentType 
3 Titre de la tâche0 
4 Modifié le 24/11/2014 12:29:30 PM

Et ce sont exactement les valeurs que j'attends et que je veux. Le problème est de les ajouter en tant que propriétés à un objet. Je pense que je ne peux pas avoir une variable en tant que NotePropertyName, mais c'est une conjecture sauvage basée sur les résultats que j'obtiens.

Certaines des valeurs de $ itemki [$ j] [$ fieldArray [$ k] .InternalName] sont vides - est-ce possible?

Oubliez tous les tableaux. Ils étaient juste pour le contexte:

Write-Host $fieldsArray[$k].InternalName.ToString() # Writes out the correct value
Write-Host $itemki[$j][$fieldsArray[$k].InternalName] # writes out the correct value
$itemobj | Add-Member NoteProperty $fieldsArray[$k].InternalName.ToString()($fieldsArray[$k].InternalName) # The values/property are not added

La question est: POURQUOI PAS? Existe-t-il des restrictions dans Add-Member concernant le passage de valeurs en tant que variables? Des valeurs vides?

5
grisha

Je ne suis toujours pas tout à fait sûr, mais si vous vous concentrez uniquement sur le Add-Member, considérez ce qui suit.

$fieldsarray = "ID", "ContentTypeID", "ContentType", "Title", "Modified"
$itemki = "1", "0x0108007345CD807822EA4E85691E5C642F3A27", "", "Task0", "11/24/2014 12:29:30 PM"
$itemobj = New-Object pscustomobject
for($k=0;$k -lt $fieldsArray.Count ; $k++)
{
    $itemobj | Add-Member NoteProperty $fieldsarray[$k] $itemki[$k]
}

$itemobj

Notez l'entrée de chaîne vide dans le tableau $itemki. Cela générerait la sortie.

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM

Changez le "" en un élément vide: "1","0x0108007345CD807822EA4E85691E5C642F3A27",,"Task0","11/24/2014 12:29:30 PM" et vous obtenez cette sortie:

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   : {Task0}
Title         : 11/24/2014 12:29:30 PM
Modified      :

Ce qui est faux. Ensuite, si vous modifiez l'élément vide en $null, votre sortie ressemble beaucoup au premier:

ID            : 1
ContentTypeID : 0x0108007345CD807822EA4E85691E5C642F3A27
ContentType   :
Title         : Task0
Modified      : 11/24/2014 12:29:30 PM

Concernant votre sortie

Vous dites que vous n'obtenez que le dernier élément lorsque vous $itemobj en dehors de la boucle. À quoi ressemble $itemobj après chaque passe? Les boucles for(;;){} n'envoient pas de données au flux de sortie de la même manière que le ferait un ForEach-Object{} qui mérite d'être mentionné.

10
Matt

Ne faites pas de boucle For, faites une boucle ForEach-Object. Quelque chose comme:

$Object = New-Object PSObject
$Array | ForEach{
    Add-Member -InputObject $Object -NotePropertyName $_[0] -NotePropertyValue $_[1]
}

Cela devrait faire ce que vous cherchez, je pense.

2
TheMadTechnician

Vous pouvez utiliser une table de hachage au lieu de deux tableaux. Il est très facile de créer un objet à partir d'une table de hachage. Voici un exemple:

$hash = @{
    ID            = '1'
    ContentTypeID = '0x0108007345CD807822EA4E85691E5C642F3A27'
    ContentType   = ''
    Title         = 'Task0'
    Modified      = '11/24/2014 12:29:30 PM'
}

$Object = New-Object PSObject -Property $hash
2
campbell.rw