Project

General

Profile

Function Test-Variable

function Test-Variable([System.Management.Automation.PSVariable] $Variable=$(Throw "Test-Variable : le paramètre Variable, de type PSVariable, doit être renseigné."),
                       [Type] $Type=$(Throw "Test-Variable : le paramètre Type doit être renseigné."), 
                       [Switch] $Strict,
                       [Switch] $TestEmptyString)

Sous PowerShell la gestion des paramètres d'un script ou d'une fonction s'avère quelquefois difficile, cette fonction se charge des contrôles les plus récurrents.
Un exemple, les paramètres contraint sur leur type, c'est-à-dire :

 
 function exemple ([String] ParamètreContraint)

sont initialisés à une valeur par défaut, les entiers à zéro, une chaîne de caractères avec une chaine vide, etc. On ne peut donc pas les tester sur la valeur $null afin de déterminer si un paramètre est présent ou non sur la ligne de commande. Leur valeur sera toujours renseignée, mais dans certains ce comportement attribue une valeur par défaut qui n'est pas souhaitable.
 
Dans l'exemple suivant le paramètre $attach n'est pas contraint sur un type bien qu'en interne on attende une date.
Le paramètre $attach doit être le nom d'un fichier existant :
Function SendMail($attach)
{  
  Test-Variable (gv attach) String -strict -TestEmptyString
   #second test
  #Test-Variable (gv attach) DateTime  -TestEmptyString
  if (! (Test-path $Attach)) {Throw "Le fichier n'existe pas : $Attach"}
  $Attach
   "Send mail" 
}

 #différents cas de figure
Sendmail
Sendmail "" 
Sendmail $null
Sendmail "C:\notExist.txt" 
 # PS cast une date en une string
Sendmail get-date
Sendmail (get-date)
Sendmail 1..5

 # PS cast un tableau en une string
Sendmail @(1..5)
Sendmail (Dir c:\)

Le paramètre passé à Test-Variable doit se faire à l'aide du cmdlet Get-Variable qui renvoie une instance du type PSVariable, contenant le nom et le contenu de la variable indiquée.

A des fins de test, vous pouvez modifier la signature de la fonction :

Function SendMail([String]$attach)

Une fois ceci fait, vous noterez le comportement de PowerShell lors de l'utilisation de tableau :
Sendmail @(1..5)
Le fichier n'existe pas : 1 2 3 4 5

Une valeur de type tableau passée à un paramètre contraint sur le type [String], est convertie en une chaîne de caractères, alors que la première version provoquait l'erreur suivante :
Sendmail @(1..5)
SendMail.Test-Variable : Impossible de convertir la valeur du paramètre attach « System.Object[] » en type « System.String ».