Question [Langage] La notion de Splatting

Plus d'informations
il y a 11 ans 3 mois #13423 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

Tutoriels PowerShell

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

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