Fonctions et scripts
Fonctions
1. Anatomie d’une fonction
En PowerShell et comme dans de nombreux langages, une fonction est un ensemble d’instructions auquel on donne un nom. Le principal intérêt des fonctions est que l’on peut y faire référence à plusieurs reprises, sans avoir à ressaisir l’ensemble des instructions à chaque fois. Une fonction est constituée des éléments suivants :
-
un nom ;
-
un type de portée (facultatif) ;
-
un bloc param (facultatif) ;
-
un bloc d’instructions.
En ce qui concerne le type de portée, nous aborderons cette notion un peu plus loin dans ce chapitre. L’écriture d’une fonction nécessite la syntaxe suivante :
Function [<portée> :] <nom de fonction>
{
param (<liste des paramètres>)
# bloc d'instructions
}
Prenons par exemple la fonction suivante :
Function Bonjour
{
$date = Get-Date
Write-Host "Bonjour, nous sommes le $date" -Foreground Yellow
}
Cette fonction est la plus basique qui soit. À chaque appel, elle affiche un message en Jaune dans la console. Pour appeler une fonction, il suffit tout simplement de taper son nom :
PS > Bonjour
Bonjour, nous sommes le 13/01/2018 13:18:54
2. Utilisation des arguments
Les arguments sont mentionnés ici par souci de complétude, mais sachez qu’il est largement préférable d’utiliser les paramètres (traités dans la partie suivante). En effet, les paramètres représentent le moyen de choix pour passer des valeurs à des scripts ou fonctions, et ce depuis la version 2 de PowerShell.
Une notion intéressante dans l’utilisation de fonctions ou de scripts est le passage de valeurs. Pour ce faire, une technique consiste à utiliser les arguments. Les arguments sont les valeurs placées derrière le nom de la fonction lorsque celle-ci est appelée. Voici la syntaxe de l’appel d’une fonction avec plusieurs arguments :
<Nom de fonction> <Argument1> <Argument2> <ArgumentN>
Par exemple :
PS > Bonjour Arnaud Robin
Dans cet exemple, Arnaud et Robin sont les deux arguments passés à la fonction Bonjour.
Imaginons à présent que nous venions de créer...
Scripts
Les scripts ont un fonctionnement identique aux fonctions dans le sens où ils peuvent eux aussi bénéficier de l’attribut [CmdletBinding] et de tout ce qui caractérise les fonctions avancées, prendre en charge des paramètres, proposer une aide intégrée (voir plus loin), etc. La vision de Microsoft et en particulier de l’équipe PowerShell est de permettre aux développeurs PowerShell de réaliser des scripts qui se comportent exactement comme des commandes PowerShell natives.
D’autre part, les scripts PowerShell constituent l’enveloppe physique qui contient généralement des variables, ainsi qu’un ensemble de fonctions. Ils portent l’extension .ps1.
Quelle que soit la version de PowerShell, même avec la version 6, tous les scripts portent l’extension .ps1.
1. Constitution d’un script
Un script est généralement constitué des parties suivantes :
# Nom du script, auteur, version, etc.
Déclaration des paramètres
...
Déclaration des fonctions
...
Corps principal du script
...
Ceci étant, dans sa forme la plus minimaliste, un script ne peut contenir que le corps principal, le reste n’étant pas obligatoire. Généralement, on va trouver sur les premières lignes d’un script quelques commentaires décrivant succinctement :
-
Le nom du script,
-
Un numéro de version,
-
La date de création,
-
Le nom de l’auteur.
2. Commentaires
Vous le savez sans doute déjà, de par les différents exemples que nous avons fournis, les commentaires commencent toujours par le caractère dièse...
DotSourcing
On appelle « DotSourcing » le procédé qui consiste à placer un point et un espace avant le nom d’un script (et son chemin complet ou relatif, le cas échéant), ou d’un bloc d’instructions. Cette technique permet d’exécuter le contenu d’un script dans l’étendue courante. De cette manière, toute variable ou fonction se retrouve par conséquent réutilisable, et ce, durant toute la vie de l’étendue. Prenons par exemple le script suivant qui ne contient rien d’autre que des fonctions.
# fonctions.ps1
Function Invoke-WakeUp
{
Write-Host 'Bonjour et bon réveil !' -f Yellow
}
Function Get-CTempFiles
{
Get-ChildItem -Path C:\Temp
}
Function Get-CPUTime
{
Get-Process | Where-Object {$_.CPU -gt 500}
}
En exécutant ce script de façon tout à fait classique, aucune des trois fonctions ne sera réutilisable, tout simplement parce que l’étendue créée par l’ouverture du script s’est terminée avec lui. De plus...
Aide intégrée aux scripts et fonctions
Lorsque l’on développe des fonctions ou des scripts qui doivent être utilisés par d’autres personnes que par nous-mêmes, comme par exemple dans le cadre du développement d’un module regroupant un ensemble de fonctions, il peut être très utile de fournir de l’aide.
Plutôt que d’écrire des tonnes de documentations sous forme de documents Word associés à nos modules, scripts ou fonctions, PowerShell offre une fonctionnalité extrêmement intéressante : la possibilité d’embarquer de l’aide soit directement dans le code, soit à l’extérieur sous forme de fichiers XML (respectant la grammaire MAML).
L’avantage de fournir de l’aide à nos scripts ou fonctions est que cela confère un caractère professionnel à notre travail, et ce avec un minimum d’efforts à fournir. En effet, les scripts ou fonctions disposant d’aide se comportent exactement comme les commandelettes natives. Les utilisateurs disposeront donc, à ce titre, pour chacune de vos réalisations, des trois niveaux de détails habituels, à savoir : l’aide standard, détaillée ou complète.
Reprenons pour illustrer nos propos la fonction Show-Popup étudiée précédemment....