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.

35
demandé sur SteveDJ 2013-06-28 01:48:33

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.

51
répondu Andrew Savinykh 2013-06-27 23:17:52

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
20
répondu Joel Smith 2013-06-27 22:16:11

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  
20
répondu Shaun Luttin 2014-10-16 22:26:59

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                                              
6
répondu Leandro Cascão 2017-05-11 01:47:40

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
5
répondu davidhigh 2016-07-27 14:51:43

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
0
répondu AMissico 2017-03-02 03:18:59

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"))
0
répondu Ravi Anand 2018-06-06 17:49:19