Question [Tutoriel] Utiliser le dynamisme sous PowerShell

Plus d'informations
il y a 16 ans 5 mois #5502 par Laurent Dardenne
Ce tutoriel présente les principes de base du dynamisme sous PowerShell.

Un exemple :
[code:1]
Function New-Function ($name, $properties) {
#Auteur : Doug Finke
# From : dougfinke.com/blog/index.php/2009/09/12/...ll-function-factory/
#
# Création dynamique de fonction créant des objets personnalisés.
#par défaut la fonction est créée dans la portée globale,
# si on utilise le dotsourcing la fonction est créée dans la porté locale
#
#Exemple :
# New-Function 'New-Personne' 'Nom Prénom Adresse Ville CodePostal'
# $Personne=New-Personne Durand Pierre -CodePostal 59100
#
# . New-Function 'New-Personne' 'Nom Prénom Adresse Ville CodePostal'
# $Personne=New-Personne Durand Pierre -CodePostal 59100

#On crée un scriptbloc afin de créer une porté locale
# Il renvoi le code de la fonction à créer
$sbNewFunction={

#On interroge la portée parent et pas celle du scriptblock
#le point indique une demande d'exécution dans la porté locale
if ((Get-Variable MyInvocation -Scope 1).Value.InvocationName -eq '.')
{
Write-Debug \"Scope local\"
$Scope=[String]::Empty
}
else
{
Write-Debug \"Scope global\"
$Scope=\"Global:\"
}

$parts=$null
$selectProperties=$null
$properties= $properties.Trim() -replace \"\s{2,}\",\" \"
$parts = $properties.split(' ')
$parts |
Foreach {
$selectProperties += @\"
@{
Name = '$_'
Expression = {`$$_}
},
\"@
}

# simple way to remove the trailing comma
$selectProperties = $selectProperties -Replace \",$\", \"\"

@\"
Function $Scope$name {
param(`$$([string]::Join(',$',$parts) ))

New-Object PSObject|
select $selectProperties
}
\"@
}
#on crée la fonction dans la portée
Invoke-Expression (&$sbNewFunction)
}

Function TestF {
#Test la création dans une portée locale
. New-Function 'New-Personne' 'id number '
(dir function:new-personne).Definition
}

#Test la création dans la portée globale
New-Function 'New-Personne' 'Nom Prénom Adresse Ville CodePostal'
TestF
(dir function:new-personne).Definition
$Personne=New-Personne Durand Pierre -CodePostal 59100
[/code:1]
Ce code est détaillé dans le tutoriel cité.

Bonne lecture.<br><br>Message édité par: Laurent Dardenne, à: 17/10/09 15:07

Tutoriels PowerShell

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

Plus d'informations
il y a 16 ans 5 mois #5503 par Laurent Dardenne
Ajout d'un sous chapitre sur les variables liée.

Correction du code précédent, l'utilisation du dotsourcing crée les paramètres de la fonction dans la portée locale :
[code:1]
Function New-Function {
#($Name, $properties) on utilise Args

#Auteur : Doug Finke
# From : dougfinke.com/blog/index.php/2009/09/12/...ll-function-factory/
#
# Création dynamique de fonction créant des objets personnalisés.
#par défaut la fonction est créée dans la portée globale,
# si on utilise le dotsourcing la fonction est créée dans la porté locale
#
#Exemple :
# New-Function 'New-Personne' 'Nom Prénom Adresse Ville CodePostal'
# $Personne=New-Personne Durand Pierre -CodePostal 59100
#
# . New-Function 'New-Personne' 'Nom Prénom Adresse Ville CodePostal'
# $Personne=New-Personne Durand Pierre -CodePostal 59100

#On crée un scriptbloc afin de créer une porté locale
# Il renvoi le code de la fonction à créer

$sbNewFunction={
#On ne déclare pas de paramètre pour cette fonction
#et ce afin d'éviter un écrasement de variable existante si on
#appel cette fonction en dotsourcing.
$Name=((gv Args -scope 1).value)[0]
#http://projets.developpez.com/repositories/changes/add-lib/Add-Lib/trunk/Scripts/PackageDebugTools.ps1
Test-Variable (gv Name) String -strict -TestEmptyString
$Properties=((gv Args -scope 1).value)[1]
Test-Variable (gv Properties) String -strict -TestEmptyString

#On interroge la portée parent et pas celle du scriptblock
#le point indique une demande d'exécution dans la porté locale
if ((Get-Variable MyInvocation -Scope 1).Value.InvocationName -eq '.')
{
Write-Debug \&quot;Scope local\&quot;
$Scope=[String]::Empty
}
else
{
Write-Debug \&quot;Scope global\&quot;
$Scope=\&quot;Global:\&quot;
}

$parts=$null
$selectProperties=$null
$properties= $properties.Trim() -replace \&quot;\s{2,}\&quot;,\&quot; \&quot;
$parts = $properties.split(' ')
$parts |
Foreach {
$selectProperties += @\&quot;
@{
Name = '$_'
Expression = {`$$_}
},
\&quot;@
}

# simple way to remove the trailing comma
$selectProperties = $selectProperties -Replace \&quot;,$\&quot;, \&quot;\&quot;

@\&quot;
Function $Scope$name {
param(`$$([string]::Join(',$',$parts) ))

New-Object PSObject|
select $selectProperties
}
\&quot;@
}
#on crée la fonction dans la portée
Invoke-Expression (&amp;$sbNewFunction)
}
[/code:1]

Tutoriels PowerShell

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

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