Paramètres
Lorsqu’il est démarré dans une session PowerShell, un fichier de script (.ps1) se comporte exactement comme une commande:
- Il retourne des objets sur le pipeline
- Il admet des objets en entrée du pipeline
- Il permet de spécifier des arguments
Par exemple, voici un script MonScript.ps1
situé dans le répertoire C:\Scripts
.
$reponse = Read-Host -Prompt "Entrez le nom d'un service"
$reponse | Get-Service # Renvoie le service dans le pipeline
À la fin de l'exécution du script, un ou des objets sont envoyés sur le pipeline, résultat de Get-Service
. Ces objets sortent donc du script comme s'il s'agissait d'une commande. Si on ne fait rien avec, les objets sont convertis en texte et affichés dans la console, mais on peut les intercepter en chaînant une autre commande dans le pipeline.
Définition des paramètres
Il est possible de spécifier des paramètres à un script ou une fonction pour modifier son comportement. On peut déclarer les paramètres dans un bloc param()
, qui doit se trouver obligatoirement au tout début du script ou de la fonction.
Une fonction et un script se comportent de la même manière en ce qui concerne les paramètres. La seule différence est que la fonction est enregistrée dans la session en cours, tandis que le script est défini sous forme de fichier.
Paramètres d'un script
Un script peut admettre un ou plusieurs paramètres pour modifier son fonctionnement. On peut déclarer les paramètres dans un bloc param()
, qui doit se trouver obligatoirement au tout début du script.
param (
[double] $Param1,
[string] $Param2,
[int[]] $Param3,
[switch] $Param4
)
On y déclare les paramètres sous forme de variables typées. Le nom de la variable représente le nom du paramètre, et l'ordre de déclaration des paramètres devient sa position (lorsqu'on ne spécifie pas son nom à l'appel).
Lorsque le script sera appelé, les arguments spécifiés meubleront les variables qui leur sont associées, et on pourra les utiliser dans le script.
Par exemple, ce script, division.ps1
prend en paramètre deux nombres, un dividende et un diviseur, effectue la division de ces deux nombres, et jette le résultat dans le pipeline.
param (
[double]$Dividende,
[double]$Diviseur
)
$Dividende / $Diviseur
On remarquera aussi que PowerShell est conscient des paramètres déclarés dans le script car il nous permet de les compléter avec la touche de tabulation ou avec Ctrl+Espace
.
Paramètres d'une fonction
C'est le même principe pour une fonction. On déclare les paramètres dans un bloc param()
au début de la fonction.
function Division {
param (
[double] $Dividende,
[double] $Diviseur
)
$Dividende / $Diviseur
}
Comme alternative plus légère, on peut aussi déclarer les paramètres directement dans la déclaration de la fonction, entre parenthèses. Cette forme est plus concise et est souvent utilisée pour les fonctions plus courtes.
function Division ([double] $Dividende, [double] $Diviseur) {
$Dividende / $Diviseur
}
Validation des paramètres
Une fonction et un script .PS1
se comportent comme une commande PowerShell. L'un est enregistré dans la session en cours, l'autre est défini sous forme de fichier. Mais dans les deux cas, on peut leur définir des paramètres au moyen d'un bloc param()
.
Par exemple, le script Division.ps1
vu précédemment aurait pu, à la place, être défini comme une fonction.
function Division {
param (
[double] $Dividende,
[double] $Diviseur
)
$Dividende / $Diviseur
}
Lorsqu'on déclare des paramètres, il y a le risque que celui-ci soit mal utilisé. Par exemple, qu'arrive-t-il si on appelle la fonction de division pour diviser "Chat" par trois? Qu'arrive-t-il si on demande de diviser un nombre par zéro?
Et surtout, qu'arrive-t-il si, dans un script assez long et qui effectue plusieurs tâches, un paramètre non conforme fait planter le script à mi-chemin de son exécution?
PowerShell nous offre diverses méthodes pour valider les paramètres à la source, afin de s'assurer que toutes les valeurs sont conformes à ce qui est attendu avant de commencer son exécution.
Validation de type
Lorsqu'on spécifie un type à un paramètre, le script valide d'abord si la valeur correspond au type attendu.
param (
[double] $Dividende,
[double] $Diviseur
)
$Dividende / $Diviseur
Si la valeur attendue ne correspond pas au type du paramètre, le script plante (et c'est ce qu'on veut; mieux vaut un script qui plante qu'un script qui fait n'importe quoi).
Critères de validation
PowerShell offre, en plus de la validation de type, différents critères de validation pour identifier au maximum les risques de valeurs illégales spécifiées en paramètre.
Par exemple, si on souhaite éviter que la fonction ou le script puisse être appelé avec un diviseur égal à zéro, on peut ajouter un critère de validation dans la déclaration du paramètre. Dans l'exemple suivant, on définit un script qui, s'il est évalué False
, refusera d'exécuter le code.
param (
[double] $Dividende,
[ValidateScript( { $_ -ne 0 } )]
[double] $Diviseur
)
$Dividende / $Diviseur
On peut clairement voir, à l'analyse du message d'erreur, que le script ou la fonction a planté en raison d'un échec de validation du paramètre Diviseur
.
Il existe plusieurs types de validation de paramètre. En voici quelques exemples:
ValidateSet
La clause ValidateSet
permet de s'assurer que la valeur passée en paramètre fait partie d'une liste de valeurs admissibles.
param(
[ValidateSet('Rouge','Vert','Bleu’)]
[string] $Couleur
)
# Accepte seulement les chaînes de caractères "Rouge", "Vert" ou "Bleu"
Lorsqu'on utilise la clause ValidateSet
, cela permet à PowerShell d'énumérer les valeurs admissibles lors de l'appel de la fonction ou du script, au moyen de la touche de tabulation ou de Ctrl+Espace
.
ValidateRange
La clause ValidateRange
permet de s'assurer qu'un nombre passé en paramètre est situé entre deux valeurs inclusivement.
param(
[ValidateRange(7,120)]
[Int] $Age
)
# Accepte un nombre entier de 7 à 120 incl.
ValidateRange
exige de spécifier les valeurs minimum et maximum. Mais lorsqu'on souhaite seulement spécifier une valeur maximum ou minimum, on peut faire appel aux propriétés MaxValue et MinValue du type en question.
Par exemple, pour attendre un nombre de type [int]
de 7 ou plus, il suffit de spécifier un range de 7 à la valeur maximale du type [int]
, soit [int]::MaxValue
.
param(
[ValidateRange(7, [int]::MaxValue)]
[Int] $Age
)
# Accepte un nombre entier de 7 ou plus.