Question [Langage] La notion de Splatting
- Laurent Dardenne
- Auteur du sujet
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6300
- Remerciements reçus 68
il y a 11 ans 3 mois #13423
par Laurent Dardenne
Tutoriels PowerShell
[Langage] La notion de Splatting a été créé par Laurent Dardenne
Le Splatting (notion d'aplatir) est une façon de passer des paramètres à une commande, cette notion, d'après Bruce Payette, provient du langage
Ruby
.
On peut donc paramètrer un appel de fonction ou de cmdlet à l'aide de ce mécanisme,
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
[/code:1]
pour ce faire on créer soit un tableau d'objet contenant uniquement les arguments des paramètres :
[code:1]
$Tab=@(
\"Select TAB from Table\",
\"TABServeur\"
)
[/code:1]
soit une hashtable dont les noms de clés sont identiques aux noms de paramètres de la commande appelée :
[code:1]
$Hash=@{
Server = \"$env:ComputerName\MyInstanceName\";
Database = 'MyHASH_Base'
}
$Hash2=@{
Query = \"Select H2 from Table\";
Database = 'H2_Base'
}
[/code:1]
Par exemple pour la fonction suivante on peut utiliser ces appels :
[code:1]
Get-SQL \"Select * from Table\" \"Serveur\" \"NomDeBase\"
Get-SQL @Tab \"TABBase\"
Get-SQL \"TABBase\" @Tab
Get-SQL @Tab -Server \"SrvPrécisé\" -Query \"test\"
Get-SQL -Server \"SrvPrécisé\" @Hash2
Get-SQL \"SrvPrécisé\" @Hash2
Get-SQL @Hash2 \"SrvPrécisé\"
Get-SQL @Hash2
[/code:1]
La présence du caractére '@' indique dans ce contexte, que la liaison de paramètres se fera à partir d'une structure de données.
On peut également mixer les types d'appel, classique et splatting.
A notez que la présence du paramètre Position dans un attribut Parameter influencera cette liaison :
[code:1]
Function Get-SQL {
param(
[Parameter(Position=0)]
$Query,
[Parameter(Position=1)]
$Server = \".\",
[Parameter(Position=2)]
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
Get-SQL @Tab \"TABBase\"
Get-SQL \"TABBase\" @Tab
Get-SQL -Server \"SrvPrécisé\" @Tab
Get-SQL @Tab -Server \"SrvPrécisé\" -Query \"test\"
[/code:1]
Powershell crée dans chaque fonction, une variable automatique nommée PSBoundParameters, de type hashtable. Celle-ci contient tous les noms de de paramètres, et leur valeurs, précisés sur la ligne d'appel :
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
Write-Host ('*' *40)
$PSBoundParameters.GetEnumerator()|% {'Bound {0}= {1}' -F $_.Key,$_.Value}
}
Get-SQL \"TABBase\" @Tab
[/code:1]
Rien n'empêche de la réutiliser en tant que liste de paramètre. Ainsi on propage facilement tous les paramètres :
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Function Inner {
param($Query,$Server,$Database)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
Inner @PSBoundParameters
}
Get-SQL \"TABBase\" @Tab
[/code:1]
Voir aussi ce post .
Tip pour les valeurs par défaut des paramètres.
Message édité par: Laurent Dardenne, à: 25/01/13 19:24<br><br>Message édité par: Laurent Dardenne, à: 19/03/17 11:30
On peut donc paramètrer un appel de fonction ou de cmdlet à l'aide de ce mécanisme,
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
[/code:1]
pour ce faire on créer soit un tableau d'objet contenant uniquement les arguments des paramètres :
[code:1]
$Tab=@(
\"Select TAB from Table\",
\"TABServeur\"
)
[/code:1]
soit une hashtable dont les noms de clés sont identiques aux noms de paramètres de la commande appelée :
[code:1]
$Hash=@{
Server = \"$env:ComputerName\MyInstanceName\";
Database = 'MyHASH_Base'
}
$Hash2=@{
Query = \"Select H2 from Table\";
Database = 'H2_Base'
}
[/code:1]
Par exemple pour la fonction suivante on peut utiliser ces appels :
[code:1]
Get-SQL \"Select * from Table\" \"Serveur\" \"NomDeBase\"
Get-SQL @Tab \"TABBase\"
Get-SQL \"TABBase\" @Tab
Get-SQL @Tab -Server \"SrvPrécisé\" -Query \"test\"
Get-SQL -Server \"SrvPrécisé\" @Hash2
Get-SQL \"SrvPrécisé\" @Hash2
Get-SQL @Hash2 \"SrvPrécisé\"
Get-SQL @Hash2
[/code:1]
La présence du caractére '@' indique dans ce contexte, que la liaison de paramètres se fera à partir d'une structure de données.
On peut également mixer les types d'appel, classique et splatting.
A notez que la présence du paramètre Position dans un attribut Parameter influencera cette liaison :
[code:1]
Function Get-SQL {
param(
[Parameter(Position=0)]
$Query,
[Parameter(Position=1)]
$Server = \".\",
[Parameter(Position=2)]
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
Get-SQL @Tab \"TABBase\"
Get-SQL \"TABBase\" @Tab
Get-SQL -Server \"SrvPrécisé\" @Tab
Get-SQL @Tab -Server \"SrvPrécisé\" -Query \"test\"
[/code:1]
Powershell crée dans chaque fonction, une variable automatique nommée PSBoundParameters, de type hashtable. Celle-ci contient tous les noms de de paramètres, et leur valeurs, précisés sur la ligne d'appel :
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
Write-Host ('*' *40)
$PSBoundParameters.GetEnumerator()|% {'Bound {0}= {1}' -F $_.Key,$_.Value}
}
Get-SQL \"TABBase\" @Tab
[/code:1]
Rien n'empêche de la réutiliser en tant que liste de paramètre. Ainsi on propage facilement tous les paramètres :
[code:1]
Function Get-SQL {
param(
$Query,
$Server = \".\",
$Database = 'Orchestrator'
)
Function Inner {
param($Query,$Server,$Database)
Write-Host \"`$Query=$Query\"
Write-Host \"`$Server=$Server\"
Write-Host \"`$Database=$Database\"
}
Inner @PSBoundParameters
}
Get-SQL \"TABBase\" @Tab
[/code:1]
Voir aussi ce post .
Tip pour les valeurs par défaut des paramètres.
Message édité par: Laurent Dardenne, à: 25/01/13 19:24<br><br>Message édité par: Laurent Dardenne, à: 19/03/17 11:30
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.066 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- [Langage] La notion de Splatting