Question [Astuce][Class] PS version 5
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 3 mois #20823
par Laurent Dardenne
Tutoriels PowerShell
[Astuce][Class] PS version 5 a été créé par Laurent Dardenne
Les classes de la v5 permettent de coder des
variables liées
:
[code:1]
#PS v5.0.10240.16384
class NowVariable : System.Management.Automation.PSVariable {
NowVariable():base(\"Now\", 0, \"ReadOnly,AllScope\"«»)
{}
[object] get_Value(){
return [System.DateTime]::Now
}
[string] ToString(){ return ($this.get_Value()).ToString()}
}
$Date=[NowVariable]::new()
$Date
# Name Value
# ----
# Now 10/6/2015 2:49:48 PM
\"$Date\"
# 10/6/2015 2:49:50 PM
[/code:1]
Il reste un petit soucis, l'accès à la propriété $Date.Value ne 'fonctionne' pas, on doit appeler $Date.get_Value(). Ici ce n'est pas bloquant.
Si on crée une variable Powershell à partir de cet objet le pb disparaît :
[code:1]
$ExecutionContext.SessionState.PSVariable.Set([NowVariable]::new())
$now
#Tuesday, October 6, 2015 3:09:22 PM
\"$now\"
#10/06/2015 15:09:25
[/code:1]
[edit]
Bug getnewclosure en 5.0 et 5.1
Message édité par: Laurent Dardenne, à: 6/10/15 15:09<br><br>Message édité par: Laurent Dardenne, à: 17/02/17 13:29
[code:1]
#PS v5.0.10240.16384
class NowVariable : System.Management.Automation.PSVariable {
NowVariable():base(\"Now\", 0, \"ReadOnly,AllScope\"«»)
{}
[object] get_Value(){
return [System.DateTime]::Now
}
[string] ToString(){ return ($this.get_Value()).ToString()}
}
$Date=[NowVariable]::new()
$Date
# Name Value
# ----
# Now 10/6/2015 2:49:48 PM
\"$Date\"
# 10/6/2015 2:49:50 PM
[/code:1]
Il reste un petit soucis, l'accès à la propriété $Date.Value ne 'fonctionne' pas, on doit appeler $Date.get_Value(). Ici ce n'est pas bloquant.
Si on crée une variable Powershell à partir de cet objet le pb disparaît :
[code:1]
$ExecutionContext.SessionState.PSVariable.Set([NowVariable]::new())
$now
#Tuesday, October 6, 2015 3:09:22 PM
\"$now\"
#10/06/2015 15:09:25
[/code:1]
[edit]
Bug getnewclosure en 5.0 et 5.1
Message édité par: Laurent Dardenne, à: 6/10/15 15:09<br><br>Message édité par: Laurent Dardenne, à: 17/02/17 13:29
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 3 mois #20831
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Astuce][Class] PS version 5
La version actuelle n'exporte pas les classes d'un module, mais on peut interroger la liste des types d’un module :
[code:1]function Get-Class {
[CmdletBinding()]
param
(
[Parameter(Mandatory,ValueFromPipeline)]
[System.Management.Automation.PSModuleInfo]
$Module,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$ClassName,
[Switch] $Strict
)
$Result=@(
$Module.ImplementingAssembly.DefinedTypes|
Where {$_.isPublic -and $_.Name -eq $ClassName}
)
if ($Result.Count -eq 0)
{
$Exception=New-Object System.ArgumentException(\"Type inconnu.\",'ClassName')
If (!$Strict)
{
$PSCmdlet.WriteError(
(New-Object System.Management.Automation.ErrorRecord(
$Exception,
\"PowerShellClassNotFound\",
\"ObjectNotFound\",
(\"[{0}]\" -f $ClassName)
)
)
)
}
else
{ throw $Exception }
}
else {$Result}
}
Get-Module Test | Get-Class -ClassName 'Test'
#IsPublic IsSerial Name BaseType
#
----
#True False Test System.Object
[/code:1]
Pour des modules side-by-side (côte à côte) on utilisera le paramètre FullyQualifiedName :
[code:1]$FQN=@{ModuleName=\"Test\"; ModuleVersion ='2.0'; GUID='c51bd812-33ca-4a5c-bed8-7bc9ef50a9d2'}
Get-Module -FullyQualifiedName $FQN | Get-Class -ClassName 'Test'[/code:1].<br><br>Message édité par: Laurent Dardenne, à: 7/10/15 09:18
[code:1]function Get-Class {
[CmdletBinding()]
param
(
[Parameter(Mandatory,ValueFromPipeline)]
[System.Management.Automation.PSModuleInfo]
$Module,
[Parameter(Mandatory)]
[ValidateNotNullOrEmpty()]
[string]
$ClassName,
[Switch] $Strict
)
$Result=@(
$Module.ImplementingAssembly.DefinedTypes|
Where {$_.isPublic -and $_.Name -eq $ClassName}
)
if ($Result.Count -eq 0)
{
$Exception=New-Object System.ArgumentException(\"Type inconnu.\",'ClassName')
If (!$Strict)
{
$PSCmdlet.WriteError(
(New-Object System.Management.Automation.ErrorRecord(
$Exception,
\"PowerShellClassNotFound\",
\"ObjectNotFound\",
(\"[{0}]\" -f $ClassName)
)
)
)
}
else
{ throw $Exception }
}
else {$Result}
}
Get-Module Test | Get-Class -ClassName 'Test'
#IsPublic IsSerial Name BaseType
#
----
#True False Test System.Object
[/code:1]
Pour des modules side-by-side (côte à côte) on utilisera le paramètre FullyQualifiedName :
[code:1]$FQN=@{ModuleName=\"Test\"; ModuleVersion ='2.0'; GUID='c51bd812-33ca-4a5c-bed8-7bc9ef50a9d2'}
Get-Module -FullyQualifiedName $FQN | Get-Class -ClassName 'Test'[/code:1].<br><br>Message édité par: Laurent Dardenne, à: 7/10/15 09:18
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 3 mois #20872
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Astuce][Class] PS version 5
Il est possible de créer des
indexeurs
:
[code:1]
[System.Reflection.DefaultMember(\"Tab\"«»)]
class MyClass
{
Hidden [string[]] $Tab=(new-object string[] 10)
#renvoie une chaîne
[string] get_Tab([int]$i) { return $this.Tab[$i]}
#renvoie un entier
[Int] get_Tab ([string]$name) {
return [array]::IndexOf($this.Tab,$name)
}
[void] set_Tab([int]$i,[string] $name){
$this.Tab[$i]=$name
}
}
#O est un objet
$o=[MyClass]::new()
#qui contient une collection
$o[0]='Test'
$o[1]='Indexer'
#accessible par un numéro d'index
$o[0]
Test
#ou par un nom de clé, ici une string
$o
#1
[/code:1]
Attention cet exemple est sensible à la casse.
[code:1]
[System.Reflection.DefaultMember(\"Tab\"«»)]
class MyClass
{
Hidden [string[]] $Tab=(new-object string[] 10)
#renvoie une chaîne
[string] get_Tab([int]$i) { return $this.Tab[$i]}
#renvoie un entier
[Int] get_Tab ([string]$name) {
return [array]::IndexOf($this.Tab,$name)
}
[void] set_Tab([int]$i,[string] $name){
$this.Tab[$i]=$name
}
}
#O est un objet
$o=[MyClass]::new()
#qui contient une collection
$o[0]='Test'
$o[1]='Indexer'
#accessible par un numéro d'index
$o[0]
Test
#ou par un nom de clé, ici une string
$o
#1
[/code:1]
Attention cet exemple est sensible à la casse.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 3 mois #20892
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Astuce][Class] PS version 5
Usage d'une interface, ici ICloneable:
[code:1]
class Test : ICloneable{
[string] $Description
[int] $Compteur
Test( [string] $Description, [int] $Compteur) {
$this.Description =$Description
$this.Compteur=$Compteur
}
[System.Object] Clone(){
Return $this.MemberwiseClone()
}
}
$o=[Test]::New('Test',10)
#crée deux objets distincts
$b=$o.Clone()
$o,$b
[/code:1]
On peut utiliser la [url=http://powershell-scripting.com/index.php?option=com_joomlaboard&Itemid=76&func=view&id=20756&catid=14
]fonction suivante[/url] pour obtenir le 'template' des membres de l'interface à implémenter.<br><br>Message édité par: Laurent Dardenne, à: 15/10/15 20:08
[code:1]
class Test : ICloneable{
[string] $Description
[int] $Compteur
Test( [string] $Description, [int] $Compteur) {
$this.Description =$Description
$this.Compteur=$Compteur
}
[System.Object] Clone(){
Return $this.MemberwiseClone()
}
}
$o=[Test]::New('Test',10)
#crée deux objets distincts
$b=$o.Clone()
$o,$b
[/code:1]
On peut utiliser la [url=http://powershell-scripting.com/index.php?option=com_joomlaboard&Itemid=76&func=view&id=20756&catid=14
]fonction suivante[/url] pour obtenir le 'template' des membres de l'interface à implémenter.<br><br>Message édité par: Laurent Dardenne, à: 15/10/15 20:08
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Philippe
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 1778
- Remerciements reçus 21
il y a 9 ans 2 mois #20897
par Philippe
Réponse de Philippe sur le sujet Re:[Astuce][Class] PS version 5
Je sens que la doc de PS5 va être lourde à digéré pour un non programmeur !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 9 ans 2 mois #20899
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Astuce][Class] PS version 5
6ratgus écrit:
6ratgus écrit:
Mais parce qu'il y a beaucoup à apprendre/connaitre pour qui ne connait pas le sujet, mais on peut le faire progressivement.
On peut aussi ne pas utiliser cette possibilité, mais d'autres vont l'intégrer dans leurs outils, là aussi on peut juste manipuler sans savoir comment ça fonctionne.
Ici aucune obligation. La difficulté est que PS n'est pas un langage POO, PS adapte le concept de classe afin d'autoriser leur création.
Une personne connaissant la POO, doit tout de même apprendre comment ça fonctionne avec PS, ce sera plus rapide pour elle, mais incontournable.
Un exemple d'un 'truc' :
[code:1]
Class Test {
[scriptblock] $Code={\"\"}
Test() {
$this.Code=$this.Make(2)
}
[scriptblock] Make([int]$increment) {
function New-Counter ([int]$increment=1)
{
[int]$count=0;
{
$script:count += $increment
$count
}.GetNewClosure()
}
return (New-Counter $increment)
}
}
$o=[Test]::New()
$o.Code
&$o.Code
&$o.Code
$sb=$o.Make(10)
&$sb
&$sb
[/code:1]
On peut déclarer une fonction dans une méthode d'une classe. Doit-on ou .
C'est possible de coder comme cela, doit-on pour autant le faire ???
Bref, ici il s'agit de découvrir les possibilités, je peux dire les classes c'est super en présentant simplement cet exemple :
[code:1]class Test
[string] $Description
[int] $Compteur
}[/code:1]
Aucune risque de trouver celui-ci 'compliqué'. Il peux rassurer, mais c'est tout ce qu'il fait
Avec les 4 ou 5 pages proposées à ce jour, il n'y a pas de risque d'indigestion de côté làJe sens que la doc de PS5 va être lourde à digéré
6ratgus écrit:
Oui....pour un non programmeur !
Mais parce qu'il y a beaucoup à apprendre/connaitre pour qui ne connait pas le sujet, mais on peut le faire progressivement.
On peut aussi ne pas utiliser cette possibilité, mais d'autres vont l'intégrer dans leurs outils, là aussi on peut juste manipuler sans savoir comment ça fonctionne.
Ici aucune obligation. La difficulté est que PS n'est pas un langage POO, PS adapte le concept de classe afin d'autoriser leur création.
Une personne connaissant la POO, doit tout de même apprendre comment ça fonctionne avec PS, ce sera plus rapide pour elle, mais incontournable.
Un exemple d'un 'truc' :
[code:1]
Class Test {
[scriptblock] $Code={\"\"}
Test() {
$this.Code=$this.Make(2)
}
[scriptblock] Make([int]$increment) {
function New-Counter ([int]$increment=1)
{
[int]$count=0;
{
$script:count += $increment
$count
}.GetNewClosure()
}
return (New-Counter $increment)
}
}
$o=[Test]::New()
$o.Code
&$o.Code
&$o.Code
$sb=$o.Make(10)
&$sb
&$sb
[/code:1]
On peut déclarer une fonction dans une méthode d'une classe. Doit-on ou .
C'est possible de coder comme cela, doit-on pour autant le faire ???
Bref, ici il s'agit de découvrir les possibilités, je peux dire les classes c'est super en présentant simplement cet exemple :
[code:1]class Test
[string] $Description
[int] $Compteur
}[/code:1]
Aucune risque de trouver celui-ci 'compliqué'. Il peux rassurer, mais c'est tout ce qu'il fait
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.139 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Astuce][Class] PS version 5