Question
PSObject , Exemple et Questions
- Lemaire Patrice
- Auteur du sujet
- Hors Ligne
- Membre senior
-
Réduire
Plus d'informations
- Messages : 40
- Remerciements reçus 0
il y a 15 ans 7 mois #1694
par Lemaire Patrice
Réponse de Lemaire Patrice sur le sujet Re:PSObject , Exemple et Questions
Salut Batchman,
Je dois dire que tout ceci me laisse un poil perplexe ^^.
Je doit etre un peu fatigué ...
Merci de ton aide en tout cas.
PS: Janel si tu as plus clair pour un esprit néophite comme le miens ^^
Je dois dire que tout ceci me laisse un poil perplexe ^^.
Je doit etre un peu fatigué ...
Merci de ton aide en tout cas.
PS: Janel si tu as plus clair pour un esprit néophite comme le miens ^^
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6294
- Remerciements reçus 67
il y a 15 ans 7 mois #1695
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PSObject , Exemple et Questions
Salut,
Spirit écrit:
Une fois que l'objet, appelé aussi instance de classe, est détruit ces ajouts n'existent plus pour des objets similaires.
Si on souhaite ajouter des membres pour toutes les intances d'un type, par exemple tous les objets de la classe .NET FileInfo, on utilisera les fichiers .ps1xml (cf. ETS).
Spirit écrit:
Qu'est-ce qu'il te manque comme compléments d'infos ?
Spirit écrit:
Ces qq lignes montrent l'ajout de membres à une instance d'un type PowerShell.Je dois dire que tout ceci me laisse un poil perplexe ^^.
Une fois que l'objet, appelé aussi instance de classe, est détruit ces ajouts n'existent plus pour des objets similaires.
Si on souhaite ajouter des membres pour toutes les intances d'un type, par exemple tous les objets de la classe .NET FileInfo, on utilisera les fichiers .ps1xml (cf. ETS).
Spirit écrit:
C'est sur que je ne l'ai pas rédigé comme un cours.Janel si tu as plus clair pour un esprit néophite comme le miens ^^
Qu'est-ce qu'il te manque comme compléments d'infos ?
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6294
- Remerciements reçus 67
il y a 15 ans 6 mois #1961
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PSObject , Exemple et Questions
Pour compléter :
MemberSet est je pense accessible via du code C# principalement
[code:1]
#Crée un PSObject via le cmdlet Select
[PSObject] $Objet= 1|Select Nom,Date
$objet.Date=get-date
#Crée un PSMemberSet nommé liste et l'ajoute à l'objet
$Ms=new-object System.Management.Automation.PSMemberSet Liste
$Objet|add-member MemberSet $ms
# Le memberset ne fait pas partie des propriétés affichées par défaut
$objet
$objet|Gm
[/code:1]
Vous remarquerez que le nom affiché pour la propriété Liste est :Liste {}
Ce qui la rend,à prioris, inaccessible et je n'ai pas trouvé comment y ajouter d'informations. Donc ce point reste en stand-by...
Pour les 2 derniers type, CodeProperty et CodeMethod, ils sont utilisés pour mapper des propriétés et méthodes d'un objet Powersehll avec une propriété ou méthode, les 2 statique, d'une classe .NET compilée et accessible dans un assembly. Donc d'un usage avancé.
On autorise ainsi la prise en charge d'un traitement, d'un objet Powershell, par une classe .NET au lieu d'utiliser un membre de type ScriptProperty ou ScriptMethod.
Cette classe .NET n'étant pas adaptée/étendue (cf. ETS) pour être utilisé sous PowerShell.
On pourrait donc convertir du code PS (script), utilisé par un membre ScriptProperty ou ScriptMethod, en du code .NET (C#,VB,...).
Donc là aussi d'un usage avancé.
Il reste 2-3 petites choses à clarifier mais pour ce faire il faut étudier le SDK. Pour l'instant le scripting de PS est bien suffisant
MemberSet est je pense accessible via du code C# principalement
[code:1]
#Crée un PSObject via le cmdlet Select
[PSObject] $Objet= 1|Select Nom,Date
$objet.Date=get-date
#Crée un PSMemberSet nommé liste et l'ajoute à l'objet
$Ms=new-object System.Management.Automation.PSMemberSet Liste
$Objet|add-member MemberSet $ms
# Le memberset ne fait pas partie des propriétés affichées par défaut
$objet
$objet|Gm
[/code:1]
Vous remarquerez que le nom affiché pour la propriété Liste est :Liste {}
Ce qui la rend,à prioris, inaccessible et je n'ai pas trouvé comment y ajouter d'informations. Donc ce point reste en stand-by...
Pour les 2 derniers type, CodeProperty et CodeMethod, ils sont utilisés pour mapper des propriétés et méthodes d'un objet Powersehll avec une propriété ou méthode, les 2 statique, d'une classe .NET compilée et accessible dans un assembly. Donc d'un usage avancé.
On autorise ainsi la prise en charge d'un traitement, d'un objet Powershell, par une classe .NET au lieu d'utiliser un membre de type ScriptProperty ou ScriptMethod.
Cette classe .NET n'étant pas adaptée/étendue (cf. ETS) pour être utilisé sous PowerShell.
On pourrait donc convertir du code PS (script), utilisé par un membre ScriptProperty ou ScriptMethod, en du code .NET (C#,VB,...).
Donc là aussi d'un usage avancé.
Il reste 2-3 petites choses à clarifier mais pour ce faire il faut étudier le SDK. Pour l'instant le scripting de PS est bien suffisant

Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6294
- Remerciements reçus 67
il y a 15 ans 1 mois #2752
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:PSObject , Exemple et Questions
BatchMan écrit:
poshoholic.com/2008/07/05/essential-powe...-for-custom-objects/
[edit]
Sous PS v2 cette possibilité n'est plus possible, elle sera à priori fixée dans la prochaine release.
On doit donc créer un fichier de formatage :
stackoverflow.com/questions/1369542/can-...ript/1891215#1891215
[/edit]
Le code proposé
[code:1]
$o=1|Select Nom, DureeDeVie,Numero
$DefaultProperties =@('Nom','DureeDeVie')
$DefaultPropertySet=New System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$DefaultProperties)
$PSStandardMembers=[System.Management.Automation.PSMemberInfo[]]@($DefaultPropertySet)
$o|Add-Member MemberSet PSStandardMembers $PSStandardMembers
[/code:1]
Il se peut que ce code permette de modifier à la volée l'affichage des propriétés par défaut, à voir.
Un exemple de code C# pour CodeMethod et CodeProperty
[code:1]namespace Synthetique
{
public class MembresEtendus
{
//méthode privée
static double ConvertExposant(PSObject ObjetPS)
{
if (ObjetPS.Properties[\"Exposant\"].Value is PSObject)
{ return Convert.ToDouble((ObjetPS.Properties[\"Exposant\"].Value as PSObject).BaseObject); }
return Convert.ToDouble(ObjetPS.Properties[\"Exposant\"].Value);
}
public static double Puissance (PSObject ObjetPS)
{
Double x = Convert.ToDouble(ObjetPS.BaseObject);
return Math.Pow(x, MembresEtendus.ConvertExposant(ObjetPS));
}
public static double ExposantGet (PSObject ObjetPS)
{
return MembresEtendus.ConvertExposant(ObjetPS);
}
public static void ExposantSet (PSObject ObjetPS, double valeur)
{
ObjetPS.Properties[\"Exposant\"].Value= valeur;
}
}
}[/code:1]
Le code PowerShell associé :
[code:1]#chargement de l’assembly contenant le code référencé
$DLLpath =\"VotreRépertoire\"
$Fullpath =\"$DLLpath\Synthetique.dll\"
[void][Reflection.Assembly]::LoadFile($Fullpath)
# déclaration du membre étendu de type CodeMethod
$i=5
$i=$i|add-member NoteProperty Exposant ([int]3) –passthru;$i|gm
#Obtient une référence sur la méthode nommée \"Puissance\"
$M=[Synthetique.MembresEtendus].GetMethod(\"Puissance\"«»)
$i=$i|add-member CodeMethod Puissance $M –passthru;$i|gm
$i.Puissance()[/code:1]
CodeProperty :
[code:1]$o=1|select Valeur
$o.Valeur=10
$o|add-member NoteProperty Exposant 3 –passthru
$getter=[Synthetique.MembresEtendus].GetMethod(\"ExposantGet\"«»)
$setter=[Synthetique.MembresEtendus].GetMethod(\"ExposantSet\"«»)
$o| add-member CodeProperty MaPropriete $getter $setter;$o|gm
$o.MaPropriete=5
$o[/code:1]
Il est possible déclarer une telle propriété en lecteur seule, le setter est $null ou n’est pas renseigné :
[code:1]$o| add-member CodeProperty MaPropriete $getter[/code:1]Dans ce cas l’accés en écriture léve une exception :
[code:1]$o.MaPropriete=10
Set accessor for property \"MaPropriete\" is unavailable.[/code:1]
Dans cet exemple le code C# n’est pas d’une grande utilité et est réduit à sa plus simple expression.
Je suis en train de rédiger un tutoriel sur le sujet je le posterais dans la rubrique contributions dans une petite semaine, il me reste à finaliser le script d'exemple (portage d'un objet séquence d'Oracle sous PowerShell):
[code:1]
$Sequence= Create-Sequence \"SEQ_Test\" \"Séquence de test\" 1 -maxvalue 3
$sequence
$sequence.currval;
$Sequence.NextVal();
$sequence.currval
$Sequence= Create-Sequence \"SEQ_Test\" \"Séquence de test\" -increment_by -1
...
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 6/03/10 14:19
Voir ce post à ce sujetDonc ce point reste en stand-by...
poshoholic.com/2008/07/05/essential-powe...-for-custom-objects/
[edit]
Sous PS v2 cette possibilité n'est plus possible, elle sera à priori fixée dans la prochaine release.
On doit donc créer un fichier de formatage :
stackoverflow.com/questions/1369542/can-...ript/1891215#1891215
[/edit]
Le code proposé
[code:1]
$o=1|Select Nom, DureeDeVie,Numero
$DefaultProperties =@('Nom','DureeDeVie')
$DefaultPropertySet=New System.Management.Automation.PSPropertySet('DefaultDisplayPropertySet',[string[]]$DefaultProperties)
$PSStandardMembers=[System.Management.Automation.PSMemberInfo[]]@($DefaultPropertySet)
$o|Add-Member MemberSet PSStandardMembers $PSStandardMembers
[/code:1]
Il se peut que ce code permette de modifier à la volée l'affichage des propriétés par défaut, à voir.
Un exemple de code C# pour CodeMethod et CodeProperty
[code:1]namespace Synthetique
{
public class MembresEtendus
{
//méthode privée
static double ConvertExposant(PSObject ObjetPS)
{
if (ObjetPS.Properties[\"Exposant\"].Value is PSObject)
{ return Convert.ToDouble((ObjetPS.Properties[\"Exposant\"].Value as PSObject).BaseObject); }
return Convert.ToDouble(ObjetPS.Properties[\"Exposant\"].Value);
}
public static double Puissance (PSObject ObjetPS)
{
Double x = Convert.ToDouble(ObjetPS.BaseObject);
return Math.Pow(x, MembresEtendus.ConvertExposant(ObjetPS));
}
public static double ExposantGet (PSObject ObjetPS)
{
return MembresEtendus.ConvertExposant(ObjetPS);
}
public static void ExposantSet (PSObject ObjetPS, double valeur)
{
ObjetPS.Properties[\"Exposant\"].Value= valeur;
}
}
}[/code:1]
Le code PowerShell associé :
[code:1]#chargement de l’assembly contenant le code référencé
$DLLpath =\"VotreRépertoire\"
$Fullpath =\"$DLLpath\Synthetique.dll\"
[void][Reflection.Assembly]::LoadFile($Fullpath)
# déclaration du membre étendu de type CodeMethod
$i=5
$i=$i|add-member NoteProperty Exposant ([int]3) –passthru;$i|gm
#Obtient une référence sur la méthode nommée \"Puissance\"
$M=[Synthetique.MembresEtendus].GetMethod(\"Puissance\"«»)
$i=$i|add-member CodeMethod Puissance $M –passthru;$i|gm
$i.Puissance()[/code:1]
CodeProperty :
[code:1]$o=1|select Valeur
$o.Valeur=10
$o|add-member NoteProperty Exposant 3 –passthru
$getter=[Synthetique.MembresEtendus].GetMethod(\"ExposantGet\"«»)
$setter=[Synthetique.MembresEtendus].GetMethod(\"ExposantSet\"«»)
$o| add-member CodeProperty MaPropriete $getter $setter;$o|gm
$o.MaPropriete=5
$o[/code:1]
Il est possible déclarer une telle propriété en lecteur seule, le setter est $null ou n’est pas renseigné :
[code:1]$o| add-member CodeProperty MaPropriete $getter[/code:1]Dans ce cas l’accés en écriture léve une exception :
[code:1]$o.MaPropriete=10
Set accessor for property \"MaPropriete\" is unavailable.[/code:1]
Dans cet exemple le code C# n’est pas d’une grande utilité et est réduit à sa plus simple expression.
Je suis en train de rédiger un tutoriel sur le sujet je le posterais dans la rubrique contributions dans une petite semaine, il me reste à finaliser le script d'exemple (portage d'un objet séquence d'Oracle sous PowerShell):
[code:1]
$Sequence= Create-Sequence \"SEQ_Test\" \"Séquence de test\" 1 -maxvalue 3
$sequence
$sequence.currval;
$Sequence.NextVal();
$sequence.currval
$Sequence= Create-Sequence \"SEQ_Test\" \"Séquence de test\" -increment_by -1
...
[/code:1]<br><br>Message édité par: Laurent Dardenne, à: 6/03/10 14:19
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.055 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- PSObject , Exemple et Questions