Rencontre 6 - Paramètres et fonctions
- 👨🏫 Déroulement du cours
- 💻 Exercices à compléter
- 📚 Ressources à consulter
- Paramètres de scripts
- Fonctions
- Validations de paramètres
- Exercice 05a - Paramètres d'un script
- Exercice 05b - Fonctions
- Exercice 05c - Validation de paramètres
La présentation PowerPoint est sur le Teams du cours, sous le canal Général > Fichiers > Supports de cours.
Les scripts et le pipeline
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.
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
.
Fonctions
Une fonction PowerShell est un bloc de script qu'on enregistre dans la session en cours. On doit la déclarer en lui donnant un nom, et à l'instar d'un fichier de script, elle se comporte exactement comme un script ou une commande.
Pour déclarer une fonction, on utilise le mot-clé function
suivi de son nom, et on définit le code de la fonction entre des accolades. Il est recommandé d'indenter le contenu de la fonction.
function Get-Zero {
0
}
La déclaration d'une fonction n'a d'effet que dans la session en cours. Après l'exécution du script ou après fermeture de la fenêtre PowerShell, celle-ci n'existe plus et il faudra la déclarer à nouveau si on veut l'utiliser.
On peut obtenir la liste de toutes les fonctions qui sont déclarées dans la session PowerShell en cours à l'aide de la commande Get-ChildItem Function:
.
L'exemple ci-dessus montre la fonction déclarée sous le nom de Get-Zero
, et qui sert simplement à obtenir la valeur 0. Celle-ci ne fait qu'envoyer l'objet 0
(un nombre entier) dans le pipeline, afin que cette valeur soit récupérée à la sortie de la fonction.
Sortie dans le pipeline
Une fonction (tout comme un script, d'ailleurs), dispose en quelque sorte d'un "accumulateur" qui contient tous les objets qui tombent dans le pipeline. À la sortie de la fonction, les objets sortent sous forme de collection.
function Get-CrisDAnimaux {
"Miaou!"
"Wouf!"
"Cocorico!"
}
Cette fonction laisse tomber trois objets String
dans le pipeline. Ceux-ci sortent sous forme de collection. C'est la même chose avec un fichier PS1.
Instruction Return
L'instruction return
permet de sortir un objet sur le pipeline tout en interrompant immédiatement l'exécution de la fonction.
function Get-Zero {
return 0
Write-Host "Ce texte ne sera jamais écrit!"
}
Dans un script, on utilise souvent une fonction lorsque du code se répète souvent, pour éviter de copier-coller le même code à plusieurs endroits dans le script. Une fonction doit obligatoirement être définie avant d'être appelée, mais il est une bonne pratique de déclarer toutes les fonctions au début du script, juste après le bloc de paramètres, mais avant le code principal du script.
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.