Question PSObject , Exemple et Questions

Plus d'informations
il y a 16 ans 2 mois #1591 par Lemaire Patrice
Bonjour,

Voici un petit bout de code concernant les objets utilisateurs et leur stockage.
Je pense notamment à ceux qui veulent stocker des informations à des fins de contrôle dans le temps.
On peut donc parfaitement créer ses propres objets, avec ses propres propriétés (ou presque), stocker ainsi cet objet en XML, puis le recharger pour l’utiliser plus tard.

[code:1]
# On déclare notre Objet Utilisateur
$Obj = New-Object PSObject

# Puis on lui attribut des Propriétées
Add-Member -InputObject $Obj -MemberType NoteProperty -Name \"Couleur\" -Value \"Rouge\"
Add-Member -InputObject $Obj -MemberType NoteProperty -Name \"Marque\" -Value \"Ferari\"

# On vérifie le résultat en mémoire
$Obj | Get-Member

# Par contre ATTENTION à ca !!!!!! Comportement Surement explicable par l'usage de \"NoteProperty\"
Write-Output \"
\"
Write-Output $Obj.Couleur
Write-Output $Obj.Marque
Write-Output \"
\"
Write-Output \"Voiture de couleur : $Obj.Couleur \"
Write-Output \"Voiture de marque : $Obj.Marque \"
Write-Output \"
\"
[String]$Couleur = $Obj.Couleur
[String]$Marque = $Obj.Marque
Write-Output \"Voiture de couleur : $Couleur \"
Write-Output \"Voiture de marque : $Marque \"
Write-Output \"
\"

# Ensuite on sauvegarde en XML
Export-Clixml -Path \"Voiture.obj\" -InputObject $Obj -Force

# On le ré Importe sous un autre nom bien sur
$Bis = Import-Clixml -Path \"Voiture.obj\"

# On vérifi le contenu
$Bis | Get-Member

# On modifi une Propriété et on en ajoute une autre
$Bis.Couleur = \"Jaune\"
Add-Member -InputObject $Bis -MemberType NoteProperty -Name \"Modele\" -Value \"F40\"

# On vérifi le contenu
$Bis | Get-Member

# On le stock à nouveau
Export-Clixml -Path \"Voiture.obj\" -InputObject $Bis -Force

# On le ré Importe sous un autre nom bien sur
$Ter = Import-Clixml -Path \"Voiture.obj\"

# On vérifi le contenu
$Ter | Get-Member
[/code:1]

Par contre, si quelqu’un avait des explications claires et détaillées sur les « Member-Type » et leurs caractéristiques respectives. L’aide est très sommaire la dessus.

o • AliasProperty
Celle ci à la limite ok, C’est un simple Alias pointant vers une propriété existante en changeant son typage.

o • CodeProperty
?

o • NoteProperty
?

o • ScriptProperty
?

o • PropertySet
?

o • CodeMethod
?

o • ScriptMethod
?

o • MemberSet
?

Merci de vos retours d’expérience sur le sujet. L’utilisation d’objets « Utilisateur » est une fonction très intéressante, si on maitrise ses limites.

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

Plus d'informations
il y a 16 ans 2 mois #1593 par Arnaud Petitjean
Bonsoir Spirit,

Très pratiques effectivement les commandes Export-CliXML et Import-CliXML.

Pour reprendre ton exemple :
[code:1]Write-Output \"Voiture de couleur : $Obj.Couleur\"[/code:1]

Cela ne fonctionne pas comme tu t'y attends parce que ta variable est à l'intérieur d'une chaine. En effet, l'interpréteur substitue le résultat de la variable $Obj sans tenir compte de la suite (la propriété).
Pour que cela fonctionne il aurait fallu écrire :

[code:1]Write-Output \"Voiture de couleur : $($Obj.Couleur)\"[/code:1]
ou
[code:1]Write-Output \"Voiture de couleur :\" + $Obj.Couleur[/code:1]

Sinon, pour ce qui concerne des explications plus détaillées au sujet des membres que l'on peut ajouter à un PSObject, il est vrai que l'aide est très discrète. Je n'ai malheureusement pas d'informations complémentaires à te donner car c'est un des aspects de PowerShell que je n'ai pas encore trop creusé. Il faut dire que là on commence à dévier dans le \"monde du développement\" alors que je me focalise davantage sur les tâches d'administration système.
Je me rapelle avoir lu, il y a quelque temps déjà, quelques pages d'explications dans le livre (américain) de Bruce Payette.
Bruce est l'un des développeurs principaux de PowerShell, pour ceux qui n'aurait jamais entendu parlé de lui. Son livre est très bien, d'un très haut niveau technique, mais pas assez pratique à mon goût.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 2 mois #1604 par Lemaire Patrice
Arnaud écrit:

...Il faut dire que là on commence à dévier dans le \"monde du développement\" alors que je me focalise davantage sur les tâches d'administration système...
Arnaud

Bha oui, déformation professionnelle hein ^^.

Pour autant, et sans avoir d'exemples précis, le XML reste une sorte de language descriptif permettant de transferer de facons simple de l'information d'un systeme logiciel à un autre, en différé. Je en sait pas si cela peut etre util pour de l'administration, peut etre plus pour de l'exploitation ? Enfin bref ^^.

En tout cas Grand merci pour ton explication sur le $($Obj.truc) ...

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

Plus d'informations
il y a 16 ans 2 mois #1637 par Jacques Barathon
Hello Spirit,

Tu me donnes l'occasion d'un bon billet pour répondre à ta question sur les types de membres. Je posterai le lien ici dès que je l'aurai publié.

Janel

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

Plus d'informations
il y a 16 ans 2 mois #1642 par Laurent Dardenne
Salut,
Spirit écrit:

Par contre, si quelqu’un avait des explications claires et détaillées sur les « Member-Type » et leurs caractéristiques respectives. L’aide est très sommaire la dessus.

voici une petite contributions au travers de liens.

Les propriétés de type NoteProperty jouent un rôle particulier, en dehors du fait qu'elle commence toutes par PS, elles sont ajoutées par le provider pour faciliter les traitements.
Dans le cas de la classe .NET FileInfo la NoteProperty nommée PSIsContainer évite un traitement sur la propriété FileSystemInfo.Attributs qui elle détermine si l'instance est de type directory ou fichier.
Comme le système de provider de PowerShell se veut cohérent l'usage de cette propriété reste valide pour le provider de la registry.

Pour les autres voir l'énumération PSMemberTypes

A chaque valeur de l'énumération correspond une classe .NET PSxxx, exemple: PSNsnoteproperty

Ensuite il faut creuser du coté de (ETS) Windows PowerShell Extended Type System :
\"Conceptually, ETS uses the following terms to show the relationship between the original members of the base-object and those members added by Windows PowerShell.\"
Voir ETS Properties

Bon là il faut un peu de temps pour digérer et de l'envie pour approfondir ;-)

Il reste à déterminer l'usage et le mode de création de chacune de ses propriétés mais le billet de Janel sera certainement plus explicite.
[edit]
[url=http://msdn2.microsoft.com/en-us/library/aa347685(VS.85).aspx
]Windows PowerShell Object Concepts[/url]<br><br>Message édité par: BatchMan, à: 7/02/08 17:45

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 2 mois #1687 par Laurent Dardenne
Voici qq exemples après qq recherches et tests.

[code:1]
# Doc de Add-Member sur MDSN msdn2.microsoft.com/en-us/library/bb978596.aspx?s=6

$Dt=Get-Date
# Crée un objet de base
$o = new-object System.Management.Automation.PsObject

#Les ajouts suivants peuvent être vus comme \&quot;une construction de classe personnalisée\&quot;,
#bien que le type de la classe soit immuable, c'est à dire qu'il sera tjr de type PsObject.


#*** NoteProperty ***********************************************************************************
# Ajoute une note, c'est une propriété de type texte
$o| add-member NoteProperty DateCreation $Dt

#*** scriptmethod ***
# Ajoute une propriété \&quot;scriptée\&quot;. Similaire à un champ calculé, trés proche de la notion de propriété en .NET
# Elle posséde donc des accesseurs (getter et setter).
# Ici on construit une propriété en lecture seule.
$o | add-member -memberType Scriptproperty -Name DureeDeVie -value {[DateTime]::Now-$this.DateCreation} -SecondValue {write-host \&quot;Erreur: Cette propriété est en lecture seule.\&quot;}
#Note:
#En lieu et place on pourrait trés bien créer un membre de type ScriptMethod mais, à mon avis, sémantiquement ce n'est pas correct.
#$o | Add-Member ScriptMethod DureeDeVie {[DateTime]::Now-$this.DateCreation}
#Voir aussi : jtruher.spaces.live.com/blog/cns!7143DA6E51A2628D!130.entry

# Affiche le contenu des propriétes additionnelles
$o.DateCreation
#Le type de donnée de la propriété calculée est un interval de temps, TimeSpan
$o.DureeDeVie
$o.DureeDeVie.ToString()


#*** ScriptMethod ********************************************************************************

#On crée une méthode, on peut donc utiliser des paramètres
#Cet exemple simule l'implémentation d'une surcharge de méthode.
#La surcharge d'une méthode consiste à créer une méthode ayant le même nom mais ayant un nombre et des types d'arguments
#différents et ce afin de modifier son comportement.
$o|add-member -membertype scriptmethod FaitQuelqueChose {
#Obtient les types des paramètres et les concatène
switch([String]::Join(\&quot;,\&quot;,$($args | % { $_.gettype().name } )) )
{
#Est-ce qu'on reçoit un paramètre et est-il du type chaîne de caractères?
\&quot;String\&quot;
{
\&quot;Première signature.\&quot;
}
#Est-ce qu'on reçoit deux paramètres et sont-ils du type chaîne de caractères et entier?
\&quot;String,Int32\&quot;
{
\&quot;Seconde signature.\&quot;
}
#Est-ce qu'on reçoit trois paramètres et et sont-ils du type chaîne de caractères, entier et booléen ?
\&quot;String,Int32,Boolean\&quot;
{
\&quot;Troisième signature.\&quot;
}
#Erreur : la liste et/ou le nombre de paramètres passés à cette méthode sont inconnus.
default { throw \&quot;Aucune signature ne correspond aux paramètres reçus.\&quot; }
}
} -passthru -force

# Appel avec la première signature
$o.FaitQuelqueChose(\&quot;Test\&quot;«»)
# Appel avec une signature inconnue
$o.FaitQuelqueChose(1.2)
# issu de : www.wiredbox.net/Forum2/Thread11798_IDEA..._functions_too).aspx

#*** ParametryzedProperty *********************************************************************************

$o | Add-Member ParameterizedProperty PP {[DateTime]::Now-$this.DateCreation}
# Erreur :
# Add-Member : Impossible d'ajouter un membre du type « ParameterizedProperty ». Spécifiez un autre type pour le paramètre MemberTypes.
#Ce type de membre ne semble pas pouvoir être ajouté via Add-Member :
# \&quot;Parameterized properties are COM parameterized properties that contain parts of both properties and methods. These properties are exposed through PSParameterizedProperty objects that are created only by adapters.\&quot;
#Issu de : msdn2.microsoft.com/en-us/library/cc136162(VS.85).aspx

#*** PropertySet ***************************************************************************************

#On récupère le contenu du répertoire courant dans un tableau de fichiers
$F=Get-item *.*
#On crée un ensemble de nom de propriétés
#Ce n'est pas une énumération, cf. blogs.msdn.com/powershell/archive/2007/0...m-in-powershell.aspx
$F|add-member PropertySet \&quot;PSProperties\&quot; ([string[]](\&quot;PSChildName\&quot;,\&quot;PSDrive\&quot;,\&quot;PSIsContainer\&quot;,\&quot;PSParentPath\&quot;,\&quot;PSPath\&quot;,\&quot;PSProvider\&quot;«»))
# on affiche une vue des propriétés, ajoutées via le membre précédement créé
$F[2]| select PSProperties
#Issu de : mow001.blogspot.com/2006/01/some-fun-wit...-add-member-mp3.html

# Ensuite voir l'ajout de membre via ETS : www.leeholmes.com/blog/AddCustomMethodsA...pesInPowerShell.aspx
[/code:1]

Tutoriels PowerShell

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

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