15/11/2024

Une fonction aux allures de cmdlet avec CmdletBinding()

I. Présentation

Le simple fait d'ajouter l'instruction "[CmdletBinding()]" à l'intérieur d'une fonction lui permet de bénéficier de capacités supplémentaires, comme celles que nous retrouvons avec les cmdlets officiels. Nous allons voir comment l'intégrer dans une fonction et quels sont les bénéfices attendus.

II. Ajouter CmdletBinding() dans une fonction

Nous allons prendre comme point de départ la fonction Get-Login utilisée dans les chapitres précédents. Pour rappel, voici le code de base de cette fonction :

function Get-Login { 

    param($Nom,
          $Prenom)

    $Identifiant = (($Prenom).Substring(0,1)).ToLower() + "." + ($Nom).ToLower()

    return $Identifiant
}

Actuellement, cette fonction a deux paramètres comme le montre l'image ci-dessous :

Désormais, nous allons faire évoluer le code de la fonction pour ajouter l'instruction [CmdletBinding()], comme ceci :

function Get-Login { 

    [CmdletBinding()]
    param($Nom,
          $Prenom)

    $Identifiant = (($Prenom).Substring(0,1)).ToLower() + "." + ($Nom).ToLower()

    return $Identifiant
}

Puis, si nous chargeons en mémoire la fonction et que nous regardons la liste de ses paramètres, nous pouvons constater un résultat bien différent :

Fonction PowerShell avec CmdletBinding

Comme pour les cmdlets PowerShell, nous pouvons voir que notre fonction dispose de différents paramètres tels que ErrorAction, WarningAction, ErrorVariable, Verbose, etc..., ce qui peut s'avérer très utile pour la gestion des événements et des erreurs dans nos scripts.

III. Fonction avec Begin, Process, End

Sachez que si vous souhaitez envoyer des valeurs dans une fonction par l'intermédiaire du pipeline, vous devez ajouter l'instruction "ValueFromPipeline" au paramètre de votre choix, sur le même principe que "Mandatory" que nous avons étudié précédemment.

Voici comment configurer un paramètre de cette façon :

param([Parameter(ValueFromPipeline=$true)]$Nombre)

Pour que toutes les valeurs envoyées via le pipeline soient traitée, nous devons aussi réviser la syntaxe globale de la fonction pour intégrer trois blocs : Begin{}, Process{} et End{}.

Quelques explications s'imposent pour vous expliquer l'intérêt de cette modification :

  • Begin{} sera exécuté une seule fois, lors du premier appel de la fonction, avant de traiter la première valeur
  • Process{} sera exécuté pour chaque valeur envoyée à la fonction via le pipeline
  • End{} sera exécuté une seule fois, après avoir traité la dernière valeur envoyée via le pipeline

Ceci peut s'avérer utile pour ouvrir une connexion avant de traiter un ensemble de valeurs, puis à la fin, nous pouvons fermer la connexion.

Voici un exemple permettant de générer une liste de nombres :

Function Get-Number {
    Param([Parameter(ValueFromPipeline=$true)]$Number)
    Begin
    {
        Write-Host "Début de la liste"
    } 
    Process
    {
        Write-Host ">> $Number"
    }
    End
    {
        Write-Host "Fin de la liste"
    }
}

Puis, nous allons appeler cette fonction de cette façon :

1..15 | Get-Number

Cela signifie que nous allons envoyer les nombres 1 à 15 à la fonction.

À l'exécution, nous obtenons le résultat suivant. Nous voyons que la fonction a exécuté une seule fois les blocs Begin{} et End{}. Par contre, chaque valeur envoyée via le pipeline a été traité indépendamment.

IV. Conclusion

Grâce à ce simple ajout, nous venons passer d'une fonction à une fonction avancée en PowerShell. L'instruction [CmdletBinding()] est très utilisée lors de l'écriture de module pour que les cmdlets puissent bénéficier de ces paramètres natifs de PowerShell. De plus, le fait d'utiliser une structure de fonction basée sur "Begin{}", "Process{}" et "End{}" ouvre de nouvelles possibilités !


livre pour apprendre PowerShell
author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.