2017-09-11 4 views
0

Je dois écrire une fonction dans Powershell qui indique à part un « paramètre ne pas être passé » d'un passé avec une chaîne vide (ou toute autre chaîne)comportement Incohérence dans powershell avec des paramètres null

Je l'ai écrit comme ceci: Si j'appelle Set-X sans paramètres de ISE, cela fonctionne comme j'attend et imprime 'ok'. Mais si je le fais depuis la console normale, il imprime 'oops'.

Que se passe-t-il? Quelle est la bonne façon de le faire?

+0

Avez-vous essayé de regarder '[string] :: IsNullOrEmpty()'? Cela vous permettra de vérifier une chaîne vide ou vide. Il y a aussi '[string] :: IsNullOrWhiteSpace()' –

+0

IsNullOrEmpty() ne différencie pas null de empty. – Alex

+0

Que voulez-vous diffuser si je tape: Set-X -MyParam "hey"; Set-X-MyParam; Set-X – ArcSet

Répondre

1

Permettre à l'utilisateur de passer d'une valeur d'argument de paramètre de $null ne change pas le fait que Powershell tentera de le convertir en un [string].

conversion d'une valeur $null en Powershell à un résultat de chaîne dans une chaîne vide:

$str = [string]$null 
$null -eq $str # False 
'' -eq $str # True 

(même pour $null -as [string] et "$null")

Retirez la contrainte de type sur le paramètre MyParam si vous non seulement permettent$null mais aussi accepter$null comme un parame valeur ter:

function Set-X { 
    param(
    [AllowNull()]$MyParam = [System.Management.Automation.Language.NullString]::Value 
    ) 

    if ($null -ne $MyParam) { write-host 'oops' } 
    else { write-host 'ok' } 
}