DEV Community

Cover image for La validation des paramètres dans une fonction PowerShell
Laurent LIENHARD for FrPSUG

Posted on

La validation des paramètres dans une fonction PowerShell

La validation des paramètres

Dans cette article nous allons parler d'une option disponible dans Powershell : la validation des paramètres

Cette option a pour but, comme son nom l'indique, de valider qu'un paramètre passé à une fonction est bien celui que l'on attends.

Tout au long de cette article nous garderons le script suivant comme fil conducteur.

function Do-SomeThing {
    [CmdletBinding()]
    param (
        [String[]]$ComputerName,
        [Int]$Age
    )

    begin {
        #La valeur de computername ne doit pas être nul ou vide
        if (($null -eq $ComputerName) -or ($ComputerName -eq "")) {
            throw "La valeur de ComputerName ne peut pas être vide ou null"
        }
        #Test pour vérifier que le nom du computer ne dépasse pas 13 caractères
        If ($ComputerName.Length -gt 13) {
            Throw "Le nom du Computer ne doit pas dépasser 13 caractères"
        }

        #L'age de l'ordinateur doit-être compris entre 5 et 10 ans
        if (!(($Age -gt 5) -and ($Age -lt 10))) {
            throw "l'age doit-être compris entre 5 et 10 ans"
        }

    }

    process {
    }

    end {
    }
}

Enter fullscreen mode Exit fullscreen mode

[ValidateNotNullOrEmpty()] and [ValidateNotNull()]

ValidateNotNull : vérifie uniquement si la valeur transmise au paramètre est une valeur null. Cela fonctionnera toujours s'il est passé une chaîne vide.

ValidateNotNullOrEmpty : vérifie également si la valeur transmise est une valeur null et s'il s'agit d'une chaîne ou d'une collection vide

Dans notre exemple nous pouvons remplacer le test suivant

if (($null -eq $ComputerName) -or ($ComputerName -eq "")) {
    throw "La valeur de ComputerName ne peut pas être vide ou null"
}
Enter fullscreen mode Exit fullscreen mode

en modifiant simplement la déclaration de notre variable $ComputerName

Param (
    [ValidateNotNullOrEmpty()]
    [String[]]$ComputerName
)
Enter fullscreen mode Exit fullscreen mode

[ValidateLength()]

Cette validation permet de définir une taille minimale et maximale attendue pour un paramètre.

Dans notre exemple nous voulons que le paramètre ComputerName fasse minimum 1 caractère et au maximum 13 caractères.

Nous pouvons donc remplacer le test :

    If ($ComputerName.Length -gt 13) {
        Throw "Le nom du Computer ne doit pas dépasser 13 caractère"
    }
Enter fullscreen mode Exit fullscreen mode

par la déclaration de paramètre suivant :

Param (
    [ValidateLength(1,13)]
    [String[]]$ComputerName
)
Enter fullscreen mode Exit fullscreen mode

Mais attendez ! Nous avions déjà modifié la déclaration de ce paramètre précédemment pour ajouter [ValidateNotNullOrEmpty()] ?

Effectivement les validations des paramètres peuvent être cumulées.
Dans notre cas nous déclarons le paramètre de cette façon :

    param (
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1,13)]
        [String[]]$ComputerName
    )
Enter fullscreen mode Exit fullscreen mode

ComputerName ne doit-être ni Null, ni vide et doit faire entre 1 et 13 caractères.

[ValidateRange()]

C'est en quelque sorte le pendant de [ValidateLength()] mais pour les chiffres.
Comme pour [ValidateLength()], il permet de définir une valeur minimale et maximale que peut prendre un paramètre.

Dans notre exemple l'age du PC doit-être compris entre 5 et 10 ans.
Nous avions donc le test suivant :

    if (!(($Age -gt 5) -and ($Age -lt 10))) {
        throw "l'age doit-être compris entre 5 et 10 ans"
    }
Enter fullscreen mode Exit fullscreen mode

nous pouvons donc remplacer ce test par :

param (
    [ValidateRange(5,10)]
    [int]$Age
    )
Enter fullscreen mode Exit fullscreen mode

[ValidateCount()]

Comme pour ValidateRange() il permet de définir le nombre minimal et le nombre maximal d'objet que peux prendre une collection passée en paramètre.

    param (
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1,13)]
        [ValidateCount(1,3)]
        [String[]]$ComputerName
    )
Enter fullscreen mode Exit fullscreen mode

Dans notre exemple le paramètre ComputerName ne doit-être ni Null, ni vide, doit faire entre 1 et 13 caractères et nous ne pouvons passer que 1 à 3 objects dans la collection.

[ValidateSet()]

Cette validation permet de fournir une liste de réponse possible pour la valeur du paramètre.

Cette validation peut-être rendu Case Sensitive, si à la fin de la déclaration, la valeur ignorecase est définie à $False

le test de validation suivant

        #Être sur que la valeur est l'une de celle que je veux
        if("SIEGE","AGENCE","STOCK" -notcontains $Site) {
            throw "Le site doit-être SIEGE,AGENCE ou STOCK"
        }
Enter fullscreen mode Exit fullscreen mode

peut-être remplacer par la déclaration de la variable Site suivante

    param (
        [ValidateSet("SIEGE","AGENCE","STOCK",ignorecase=$true)]
        [String]$Site
    )
Enter fullscreen mode Exit fullscreen mode

Dans notre exemple, la paramètre ne peut prendre qu'une des 3 valeurs définies.

Nous avons également demandé à ce que le valeur du paramètre ne soit pas Case
Sensitive donc SIEGE, Siege, sieGE sont toutes des valeurs corrects.

[ValidatePattern()]

Permet d'utiliser une expression régulière (REGEX) avant de tester la valeur d'un paramètre.

Dans notre script, nous avins le test suivant

        #Test pour savoir si le ComputerName correspond la nomenclature de l'entreprise
        if ($ComputerName -notmatch "^SRV-\D{6}\d{3}$") {
            Throw "Le ComputerName doit-être sous la forme SRV-LETTRE(6)CHIFFRE(3)"
        }
Enter fullscreen mode Exit fullscreen mode

Nous voulons donc être sur que le paramètre ComputerName soit toujours sous la forme d'un string commençant par SRV- suivi de 6 lettres et de 3 chiffres.

Nous pouvons remplacer ce test par la validation

    param (
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1,13)]
        [ValidateCount(1,3)]
        [ValidatePattern('^SRV-\D{6}\d{3}$')]
        [String[]]$ComputerName
    )
Enter fullscreen mode Exit fullscreen mode

[ValidateScript()]

Cette validation permet de définir un script qui va être executer pour valider la valeur du paramètre.

Notre test pour valider l'existence du chemin

        #Savoir si le chemin passé en paramètre existe et est un répertoire
        IF (!(Test-Path $Path -PathType Container))
        {
            Throw "$($Path) n'est pas un dossier valide"
        }
Enter fullscreen mode Exit fullscreen mode

peut-être remplacer par la validation suivante

    param (
        [ValidateScript(
            {IF (!(Test-Path -Path $_)) {
                Throw "$($Path) n'est pas un dossier valide"
            } else {
                $true
            }
            }
        )]
        [String]$Path
    )
Enter fullscreen mode Exit fullscreen mode

Comme vous pouvez l'imaginer, le script peut-être quelque chose de plus compliqué qu'un simple test comme ici.

Conclusion

Pour conclure nous pouvons comparer simplement nos 2 versions de script.

Le script d'origine

function Do-SomeThing {
    [CmdletBinding()]
    param (
        [String[]]$ComputerName,
        [Int]$Age
    )

    begin {
        #La valeur de computername ne doit pas etre nul ou vide
        if (($null -eq $ComputerName) -or ($ComputerName -eq "")) {
            throw "La valeur de ComputerName ne peut pas être vide ou null"
        }
        #Test pour vérifier que le nom du computer ne dépasse pas 13 caractères
        If ($ComputerName.Length -gt 13) {
            Throw "Le nom du Computer ne doit pas dépasser 13 caractères"
        }

        #L'age de l'ordinateur doit-être compris entre 5 et 10 ans
        if (!(($Age -gt 5) -and ($Age -lt 10))) {
            throw "l'age doit-être compris entre 5 et 10 ans"
        }

    }

    process {
    }

    end {
    }
}
Enter fullscreen mode Exit fullscreen mode

Le script final

function Do-SomeThing {
    [CmdletBinding()]
    param (
        [ValidateNotNullOrEmpty()]
        [ValidateLength(1,13)]
        [ValidateCount(1,3)]
        [ValidatePattern('^SRV-\D{6}\d{3}$')]
        [String[]]$ComputerName,
        [ValidateScript({IF (!(Test-Path -Path $_)) {
            Throw "$($Path) n'est pas un dossier valide"
        } else {
            $true
        }
        })]
        [String]$Path,
        [ValidateSet("SIEGE","AGENCE","STOCK",ignorecase=$true)]
        [String]$Site,
        [ValidateRange(5,10)]
        [int]$Age
    )

    begin {
    }

    process {
    }

    end {
    }
}
Enter fullscreen mode Exit fullscreen mode

Nous constatons assez clairement que nous avons diminué les lignes de code nécessaire pour valider les paramètres et de ce fait simplifier la compréhension du script.

Top comments (0)