Question [Tutoriel] Utiliser le dynamisme sous PowerShell
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 5 mois #5502
par Laurent Dardenne
Tutoriels PowerShell
[Tutoriel] Utiliser le dynamisme sous PowerShell a été créé 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
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.
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 16 ans 5 mois #5503
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:[Tutoriel] Utiliser le dynamisme sous PowerShell
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 \"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)
}
[/code:1]
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 \"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)
}
[/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
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- [Tutoriel] Utiliser le dynamisme sous PowerShell