web-dev-qa-db-fra.com

Le paramètre vide n'est pas Null dans la fonction

Étant donné cette fonction de base:

Function TestFunction {
    Param ( [int]$Par1, [string]$Par2, [string]$Par3 )
    If ($Par1 -ne $Null) { Write-Output "Par1 = $Par1" }
    If ($Par2 -ne $Null -or $Par2 -ne '') { Write-Output "Par2 = $Par2" }
    If ($Par3 -ne $Null) { Write-Output "Par3 = $Par3" }
}
TestFunction -Par1 1 -Par3 'par3'

... la sortie est:

Par1 = 1
Par2 = 
Par3 = par3

Même si je n'ai rien passé dans la variable $Par2, ce n'est toujours pas Null ou vide. Que s'est-il passé et comment puis-je réécrire l'instruction pour que la deuxième instruction If soit évaluée comme étant False et que le bloc de script ne soit pas exécuté?

(J'ai ajouté le -or $Par2 -ne '' juste pour tester, il se comporte de la même manière avec et sans.)

6
Mark

Votre programme contient une erreur de logique: $Par2 sera toujours différent de $null ou différent de ''.

Pour corriger la logique, vous devriez utiliser -and au lieu de -or ici:

If ($Par2 -ne $Null -and $Par2 -ne '') { Write-Output "Par2 = $Par2" }

Cependant, parce que vous avez converti l'argument $Par2 en chaîne dans la liste des arguments de la fonction:

Param ( [int]$Par1, [string]$Par2, [string]$Par3 )
                    ^^^^^^^^

la vérification de $Par2 -ne $Null est inutile car $Par2 sera toujours du type chaîne (si vous ne lui donnez pas de valeur, elle sera affectée à ''). Donc, vous devriez réellement écrire:

If ($Par2 -ne '') { Write-Output "Par2 = $Par2" }

Ou, puisque '' est évalué à false, vous pouvez simplement faire:

If ($Par2) { Write-Output "Par2 = $Par2" }
10
iCodez