{{tag>dev powershell}}
====== PowerShell : Utiliser des paramètres nommés ======
Pour plus de flexibilité, les scripts et les fonctions peuvent accepter des paramètres nommés.
On déclare les paramètres nommés en début de script ou de fonction avec le bloc **''Param()''**:
# Début de script aScript.ps1
Param (
$FirstParam,
$SecondParam,
$ThirdParam
)
function aFunctionName {
Param(
$FirstParam,
$SecondParam,
$ThirdParam
)
BEGIN{}
PROCESS{}
END{}
}
Avec des paramètres déclarés ainsi, l'utilisateur peut appeler le script et bénéficier de l'autocomplétion sur les options de la même manière que pour les cmdlets.
# Appel du script avec les paramètres nommés :
aScript.ps1 -FirstParam aValue1 -SecondParam aValue2 -ThirdParam aValue3
# On appelle une fonction de la même manière
aFunctionName -FirstParam aValue1 -SecondParam aValue2 -ThirdParam aValue3
S'il n'y a pas de bloc **Param()** en début de script les données fournies au script à l’exécution sont tout de même accessible dans la variable **$args**.
Param() reçoit des variables, elles peuvent être fortement typées :
Param (
[int] $TankID,
[float] $WaterLevel
)
Le type **Switch** permet de facilement tester si une option a été fournie lors de l'appel
Param (
[int] $TankID,
[float] $WaterLevel,
[Switch] $ResetCounters
)
If ($ResetCounters -eq $True)
{
# L'option -ResetCounters a été saisie lors de l'appel
}
L'utilisation d'un décorateur permet d'ajouter des attributs aux paramètres :
* Caractère obligatoire ou non ;
* Message d'aide
Param (
[Parameter(Mandatory, HelpMessage = 'Cistern identidier')] [int] $TankID,
[Parameter(Mandatory, HelpMessage = 'Water level in meters') ][float] $WaterLevel
)
Pour ajouter de l'aide sur le paramètre, il existe l'attribut **PSDefaultValue**
Param(
[Parameter(Mandatory, HelpMessage = 'Cistern identidier')]
[PSDefaultValue(Help='Current directory', Value=102)]
[int] $TankID = 102
)
On peut également introduire des tests de validation des paramètres. La validation peut s'appliquer aux variables en général
Param(
[Parameter(Mandatory)]
[ValidateSet("Low", "Average", "High")]
[string[]]$Detail
)
===== Utiliser les paramètres courants =====
Les fonctions nommées peuvent hériter des paramètres courants comme **-Verbose** ou **-Debug**. Pour une informations exhaustive confère [[https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_commonparameters?view=powershell-7.3|A propos des paramètres courants (Microsoft Learn)]].
Dans l'exemple ci-dessous on exploite le paramètre courant **-Verbose** dans une fonction nommée :
function aFonctionName {
Param(
# Nécessaire pour lier les paramètres courants
[CmdletBinding()]
)
# Affiche un message avec la valeur de l'option Verbose si elle est positionnée, false sinon.
Write-Host "`$Verbose = $( if ( $PSBoundParameters.ContainsKey('Verbose') ){$PSBoundParameters['Verbose']}else{$false} )"
}
L'avantage de ce code est qu'il a un comportement attendu avec les appels suivants :
aFonctionName
$Verbose = False
aFonctionName -Verbose
$Verbose = True
aFonctionName -Verbose:$false
$Verbose = False
aFonctionName -Verbose:$true
$Verbose = True
Les variables ''$PSCmdlet.MyInvocation.BoundParameters'' et ''$PSBoundParameters'' référencent le même objet : on peut les utiliser indifféremment :
# Tester la présence du paramètre courant Verbose
$PSCmdlet.MyInvocation.BoundParameters["Verbose"].IsPresent
$PSCmdlet.MyInvocation.BoundParameters.ContainsKey('Verbose')
$PSBoundParameters["Verbose"].IsPresent
$PSBoundParameters.ContainsKey('Verbose')
# Accéder à la valeur du paramètre courant Verbose
$PSCmdlet.MyInvocation.BoundParameters['Verbose']
$PSBoundParameters['Verbose']
$PSBoundParameters.Item('Verbose')
$PSBoundParameters.verbose
===== Références =====
* https://learn.microsoft.com/fr-fr/training/modules/use-methods-to-accept-user-inputs-windows-powershell-scripts/6-pass-parameters-script
* https://aka.ms/about-functions-advanced-parameters