Question PSObject , Exemple et Questions

Plus d'informations
il y a 16 ans 2 mois #1694 par Lemaire Patrice
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 ^^

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

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

Je dois dire que tout ceci me laisse un poil perplexe ^^.

Ces qq lignes montrent l'ajout de membres à une instance d'un type PowerShell.
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:

Janel si tu as plus clair pour un esprit néophite comme le miens ^^

C'est sur que je ne l'ai pas rédigé comme un cours.
Qu'est-ce qu'il te manque comme compléments d'infos ?

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 1 mois #1961 par Laurent Dardenne
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 :lol:

Tutoriels PowerShell

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

Plus d'informations
il y a 15 ans 7 mois #2752 par Laurent Dardenne
BatchMan écrit:

Donc ce point reste en stand-by...

Voir ce post à ce sujet
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.074 secondes
Propulsé par Kunena