Vide paramètre n'est pas Null dans la fonction
Compte tenu de 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 pas passer n'importe quoi dans le $Par2
variable, il n'est toujours pas la valeur Null ou vide. Ce qui s'est passé, et comment puis-je réécrire l'instruction afin que la deuxième if est fausse (False) et le script-bloc ne soit pas exécutée?
(J'ai ajouté le -or $Par2 -ne ''
juste pour tester, il se comporte de la même avec et sans elle.)
Vous devez vous connecter pour publier un commentaire.
Vous avez une erreur de logique dans votre programme:
$Par2
sera toujours ne pas être égale à$null
ou pas égal à''
.Pour corriger la logique, vous devez utiliser
-and
au lieu de-or
ici:Cependant, parce que vous lançais la
$Par2
argument une chaîne de caractères en fonction de la liste d'arguments:le vérifier
$Par2 -ne $Null
est inutile puisque$Par2
sera toujours de type chaîne de caractères (si vous ne lui donnez pas une valeur, il sera affecté à''
). Donc, en fait, vous devez écrire:Ou, parce que
''
a la valeur false, vous pourriez juste faire:$Par2
? Si je passe une valeur en elle,$Par2 -ne $Null
sera vrai. Mais si je passe rien en elle$Par2 -ne $Null
doit être fausse et ne doit pas être exécuté, non? Et pourtant, il ne...$Par2
sera toujours une chaîne parce que vous avez joué à l'un en fonction de la liste d'arguments. Aussi, pour l'avenir, vous pouvez obtenir le type d'une variable à l'aide de laGetType
méthode:$Par2.GetType()
. Cela va grandement faciliter le débogage.[string]$Par2 = $Null
)? Et un entier qui sera toujours 0? Donc si on passe rien dans$par1
, puisIf ($Par1)
sera vrai, car il contient 0? Donc, en essayant d'écrire un meilleur scénario par la coulée de la variable de types, je effectivement rendu plus difficile pour moi.$Par2
ne sera jamais$null
parce que vous il coulé à une chaîne. Même si vous ne[string]$Par2 = $Null
, il sera encore affectée à''
(vous pouvez le tester à l'aide de$Par2.GetType()
). Et oui,[int]$Par1 = $Null
fera$Par1
devenir0
. Cependant,If ($Par1)
ne sera pas le cas parce que0
évalue à false dans un contexte booléen (tous les autres nombres sont évaluées à true).[string]$Par2 = [System.Management.Automation.Language.NullString]::Value
pour transformer une chaîne en null après tout, maintenant que j'ai une idée de ce à Google pour. Bien que cela ne fonctionne pas pour les entiers.Vous pouvez le vérifier (vérifier si $variablename a $null comme valeur):
if (!$variablename) { Write-Host "variable is null" }
Et si vous voulez vérifier si $variablename a aucune valeur, sauf $null:
if ($variablename) { Write-Host "variable is NOT null" }