Question création d'une collection d'objets

Plus d'informations
il y a 16 ans 5 mois #5374 par otokonohito
Bonjour,
je suis nouveau venue sur le forum.
Il y a un concept que je n'arrive pas à mettre en place avec Powershell.
Voici mon problème :
Je souhaite réaliser mes propres objects pour ensuite pouvoir les exporter.
j'utilise donc la commande suivante
$output = new-object PSObject
J'ajoute des propriétés à mon objet avec
$output | add-member noteproperty variable1 \"valeur1\"

Jusque là ça marche.
Mais je n'arrive pas générer une collection d'objet.

Je souhaiterais pouvoir en sortie faire
$output[0] et avoir les propriétés de mon object 0
$output[1] et avoir les propriétés de mon objet 1
ainsi de suite...

mais quand je tape
$output[0] | add-member noteproperty variable1 \"valeur1\"
j'ai une erreur.

Est ce que quelqu'un sait comment créer sa propre collection d'objet?

Merci de vos retours

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5377 par Laurent Dardenne
Salut,
otokonohito écrit:

Est ce que quelqu'un sait comment créer sa propre collection d'objet?

Déjà déterminer quelle type de collection tu souhaites.

La plus courante, un tableau:
[code:1]
#tableau de 5 éléments de 0 à 4
$Output=new-object System.Management.Automation.PSObject[] 5

#ou,tableau vide
[System.Management.Automation.PSObject[]] $output = @()

#plus concis, un tableau vide
$output = @()
[/code:1]
Pour l'ajout
[code:1]
#tableau vide
$output += New-Object MonObjet

#ou sur un tableau contenant 5 éléments
$output[5]= New-Object MonObjet
[/code:1]
otokonohito écrit:

$output[1] et avoir les propriétés de mon objet 1

Tu récupères avant cela un objet

otokonohito écrit:

mais quand je tape
$output[0] | add-member noteproperty variable1 \"valeur1\"
j'ai une erreur.

Tu ne peux pas indexer un objet, seulement une collection. Ici ton objet n'est pas un tableau.
Ensuite il me semble qu'il y ait un bug avec cette approche:
[code:1]$output[0]=$output[0]|add-member noteproperty Note 10 -pass[/code:1]
Je vais vérifier ça.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5378 par otokonohito
En fait je souhaite faire une collection de machines avec des propriétés comme le nom, l'adresseIP, l'OS,...
Je connais toutes mes requêtes AD et WMI que j'enregistre dans des variables.

J'aimerais avoir un objet de mon cru comme $test suivant :

[code:1]$test = get-childitem
$test.gettype()

IsPublic IsSerial Name BaseType



True True Object[] System.Array[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5379 par Laurent Dardenne
otokonohito écrit:

En fait je souhaite faire une collection de machines avec des propriétés comme le nom, l'adresseIP, l'OS,...

Si les informations des machines proviennent d'une seule source, WMI par exemple, utilise Select-object
[code:1]
$MesObjets=$Machines|Select Name,IP,OS
[/code:1]
Si tu as + sources, tu dois utiliser add-Member ou combiner les 2 approches.
[code:1]
$Collection=gwmi \"win32_process\"|select name,ThreadCount,truc|% {$_.truc=$FromAD.Property}
[/code:1]
otokonohito écrit:

J'aimerais avoir un objet de mon cru comme $test suivant

Dans cet exemple, je n'y vois pas d'objet personnalisé. Je pense qu'ici on n'utilise pas les mêmes mots pour définir la même chose :S

Tu peux aussi consulter ce tutoriel .

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5380 par otokonohito
Voici ce que je souhaitais faire

[code:1]$ordis = new-object System.Management.Automation.PsObject[] 2
$ordis.count
$ordis.gettype()
$ordis[0] = \"ordi1\"
$ordis[1] = \"ordi2\"
add-member -inputobject $ordis[0] -membertype noteproperty -name \"ordi\" -value \"SRV1\"
add-member -inputobject $ordis[0] -membertype noteproperty -name \"os\" -value \"Win2008\"
add-member -inputobject $ordis[0] -membertype noteproperty -name \"sp\" -value \"SP1\"
add-member -inputobject $ordis[1] -membertype noteproperty -name \"ordi\" -value \"SRV2\"
add-member -inputobject $ordis[1] -membertype noteproperty -name \"os\" -value \"Win2003\"
add-member -inputobject $ordis[1] -membertype noteproperty -name \"sp\" -value \"SP2\"[/code:1]

Une collection d'objet ordinateur mais j'ai encore un soucis.
La commande format-list ne voit pas les propriétés du type \"Noteproperty\" et lorsque j'exporte en CSV ma collection, le résultat est mal formaté. Je ne peux pas choisir les champs que je veux afficher. Il m'affiche tous les champs de type property et noteproperty.

[code:1]PS $ordi | export-csv $home\export.csv
PS get-content $home\export.csv
#TYPE System.String
\"ordi\",\"os\",\"sp\",\"Length\"
\"SRV1\",\"Win2008\",\"SP1\",\"5\"
\"SRV2\",\"Win2003\",\"SP2\",\"5\"[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 16 ans 5 mois #5382 par Laurent Dardenne
Avec ta première approche, tu ne crées pas d'objet personnalisé tu utilises des objets de type string. Ensuite tu ajoutes des propriétés sur chacun de ces objets :
[code:1]
$ordis[0].gettype()
IsPublic IsSerial Name BaseType

----
True True String System.Object
[/code:1]
Pour exporter un sous-ensemble il faut faire ceci :
[code:1]
$ordis|select name,os|export-csv test.txt
[/code:1]
La première ligne du fichier csv sera dans ce cas différente :
[code:1]
#TYPE System.Management.Automation.PSCustomObject
[/code:1]
Idem pour Format-List :
[code:1]
$ordis|ft os,sp #ne fonctionne pas
$ordis|select os,sp|ft os,sp
[/code:1]
Avec l'approche suivante
[code:1]
$ordis = new-object System.Management.Automation.PsObject[] 2
$ordis.count
$ordis.gettype()
$ordis[0] = 1|Select Name,os,sp
$ordis[1] = 1|Select Name,os,sp

$ordis[0].name=\"SRV1\"
$ordis[0].os=\"Win2008\"
$ordis[0].sp=\"SP1\"

$ordis[1].name=\"SRV2\"
$ordis[1].os=\"Win2003\"
$ordis[1].sp=\"SP2\"
$ordis
[/code:1]
Tu crées 2 objets ayant 3 propriétés, ainsi tu récupéres directement des objets personnalisés et plus des objets \"enrichis\" :
[code:1]
$ordis[0].gettype()
IsPublic IsSerial Name BaseType

----
True False PSCustomObject System.Object
[/code:1]
Du coup Format-List répond bien :
[code:1]
$ordis|ft os,sp
[/code:1]

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.055 secondes
Propulsé par Kunena