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
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?
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é.
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.
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