Powershell: comment initialiser un tableau d'objets personnalisés?
Je suis assez nouveau pour PowerShell, et généralement Google ou la recherche de forums comme ceux - ci donne les réponses que je cherche-mais pas cette fois. Voici donc ma question (généralisée à partir d'une tâche spécifique pour des raisons de confidentialité / sécurité):
Tout d'abord, comme cela conduit à ma question, je vais commencer par noter que j'ai travaillé avec XML un peu dans Powershell, et comme comment je peux lire les données à partir de fichiers xml, rapidement, dans des tableaux d'objets personnalisés. Par exemple, si j'avais le fichier XML suivant:
<stuff>
<item name="Joe" age="32">
<info>something about him</info>
</item>
<item name="Sue" age="29">
<info>something about her</info>
</item>
<item name="Cat" age="12">
<info>something else</info>
</item>
</stuff>
Et si je le lis simplement, comme ceci:
[xml]$myxml = Get-Content .my.xml
...ensuite, je peux accéder à un tableau de mes éléments comme ceci:
[array]$myitems = $myxml.stuff.Item
$myitems
name age info
---- --- ----
Joe 32 something about him
Sue 29 something about her
Cat 12 something else
Alors, maintenant ma QUESTION. Comment puis-je créer une structure similaire d'un tableau d'objets personnalisés et les initialiser dans mon script, sans lire un fichier? Oh, oui, je peux faire beaucoup de boucle et / ou beaucoup de création / initialisation d'objets individuels... et puis l'ajouter à un tableau... un à la fois...
Mais il semble qu'il devrait y avoir un moyen d'effectuer cela création / initialisation d'une manière plus simple. Notez que la clé ici, c'est que mes objets personnalisés ont plus de 2 éléments (sinon, j'aurais utilisé un hachage en un instant!).
J'ai même regardé créer une grande chaîne de XML, et en utilisant Select-XML, mais je n'ai tout simplement pas pu obtenir la bonne syntaxe (si c'était même la bonne route à suivre).
Donc, toute aide ici serait très appréciée.
7 réponses
Je ferais quelque chose dans ce sens:
$myitems =
@([pscustomobject]@{name="Joe";age=32;info="something about him"},
[pscustomobject]@{name="Sue";age=29;info="something about her"},
[pscustomobject]@{name="Cat";age=12;info="something else"})
Notez que cela ne fonctionne que dans Powershell 3 , mais puisque vous n'avez pas mentionné la version dans votre question, je suppose que cela n'a pas d'importance pour vous.
Peut-être que vous voulez dire comme ça? J'aime faire un objet et utiliser format-table
PS C:\Users\Joel> $array = @()
PS C:\Users\Joel> $object = New-Object -TypeName PSObject
PS C:\Users\Joel> $object | Add-Member -Name 'Name' -MemberType Noteproperty -Value 'Joe'
PS C:\Users\Joel> $object | Add-Member -Name 'Age' -MemberType Noteproperty -Value 32
PS C:\Users\Joel> $object | Add-Member -Name 'Info' -MemberType Noteproperty -Value 'something about him'
PS C:\Users\Joel> $array += $object
PS C:\Users\Joel> $array | Format-Table
Name Age Info
---- --- ----
Joe 32 something about him
Cela placera tous les objets que vous avez dans le tableau dans des colonnes en fonction de leurs propriétés
Astuce: utiliser -auto Taille mieux la table
PS C:\Users\Joel> $array | Format-Table -Auto
Name Age Info
---- --- ----
Joe 32 something about him
Vous pouvez également spécifier les propriétés que vous voulez dans la table il suffit de séparer chaque nom de propriété avec une virgule
PS C:\Users\Joel> $array | Format-Table Name, Age -Auto
Name Age
---- ---
Joe 32
Voici une façon concise d'initialiser un tableau d'objets personnalisés dans PowerShell.
> $body = @( @{ Prop1="1"; Prop2="2"; Prop3="3" }, @{ Prop1="1"; Prop2="2"; Prop3="3" } )
> $body
Name Value
---- -----
Prop2 2
Prop1 1
Prop3 3
Prop2 2
Prop1 1
Prop3 3
Le moyen le plus simple d'initialiser un tableau
Créer un tableau
$array = @()
Créer votre en-tête
$line = "" | select name,age,phone
Remplir la ligne
$line.name = "Leandro"
$line.age = "39"
$line.phone = "555-555555"
Ajouter une ligne à $ array
$array += $line
Résultat
$array
name age phone
---- --- -----
Leandro 39 555-555555
Voici une version plus concise de la réponse acceptée qui évite de répéter les identificateurs NoteProperty et le [pscustomobject]
-cast:
$myItems = ("Joe",32,"something about him"), ("Sue",29,"something about her")
| ForEach-Object {[pscustomobject]@{name = $_[0]; age = $_[1]; info = $_[2]}}
Résultat:
> $myItems
name age info
---- --- ----
Joe 32 something about him
Sue 29 something about her
Utilisez une "here-String" et convertissez-la en XML.
[xml]$myxml = @"
<stuff>
<item name="Joe" age="32">
<info>something about him</info>
</item>
<item name="Sue" age="29">
<info>something about her</info>
</item>
<item name="Cat" age="12">
<info>something else</info>
</item>
</stuff>
"@
[array]$myitems = $myxml.stuff.Item
$myitems
J'ai dû créer un tableau de type prédéfini, j'ai réussi à faire comme suit:
[System.Data.DataColumn[]]$myitems = ([System.Data.DataColumn]("col1"),
[System.Data.DataColumn]("col2"), [System.Data.DataColumn]("col3"))