Question [Astuce][Class] PS version 5

Plus d'informations
il y a 8 ans 5 mois #20823 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

Tutoriels PowerShell

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

Plus d'informations
il y a 8 ans 5 mois #20831 par Laurent Dardenne
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(\&quot;Type inconnu.\&quot;,'ClassName')
If (!$Strict)
{
$PSCmdlet.WriteError(
(New-Object System.Management.Automation.ErrorRecord(
$Exception,
\&quot;PowerShellClassNotFound\&quot;,
\&quot;ObjectNotFound\&quot;,
(\&quot;[{0}]\&quot; -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=\&quot;Test\&quot;; 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.

Plus d'informations
il y a 8 ans 5 mois #20872 par Laurent Dardenne
Il est possible de créer des indexeurs :
[code:1]
[System.Reflection.DefaultMember(\&quot;Tab\&quot;«»)]
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.

Plus d'informations
il y a 8 ans 5 mois #20892 par Laurent Dardenne
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&amp;Itemid=76&amp;func=view&amp;id=20756&amp;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.

Plus d'informations
il y a 8 ans 5 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 ! :sick: :blink:

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

Plus d'informations
il y a 8 ans 5 mois #20899 par Laurent Dardenne
6ratgus écrit:

Je sens que la doc de PS5 va être lourde à digéré

Avec les 4 ou 5 pages proposées à ce jour, il n'y a pas de risque d'indigestion de côté là :P
6ratgus écrit:

...pour un non programmeur ! :sick: :blink:

Oui.
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={\&quot;\&quot;}

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
&amp;$o.Code
&amp;$o.Code

$sb=$o.Make(10)
&amp;$sb
&amp;$sb
[/code:1]
On peut déclarer une fonction dans une méthode d'une classe. Doit-on :sick: ou :lol:.
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.080 secondes
Propulsé par Kunena