Question

Dans PowerShell 1.0, si j’ai un paramètre de cmdlet de type enum, quelle est la méthode recommandée pour vérifier si l’utilisateur a spécifié ce paramètre sur la ligne de commande de la cmdlet? Par exemple:

MyEnum : int { No = 0, Yes = 1, MaybeSo = 2 }

class DoSomethingCommand : PSCmdlet
...
private MyEnum isEnabled;

[Parameter(Mandatory = false)]
public MyEnum IsEnabled
{
    get { return isEnabled; }
    set { isEnabled = value; }
}

protected override void ProcessRecord()
{
    // How do I know if the user passed -IsEnabled <value> to the cmdlet?
}

Y a-t-il un moyen de faire cela sans avoir à utiliser comme valeur une variable fictive isEnabled? Par défaut, il sera égal à 0 et je ne veux pas avoir à semer chaque paramètre ou à ajouter une valeur factice à mon enum. J'ai potentiellement plusieurs cmdlets avec des centaines de paramètres. Il doit y avoir un meilleur moyen. Ceci est lié à cette question , mais je cherchait un moyen plus propre de le faire. Merci.

Était-ce utile?

La solution

Dans ce cas, j’utiliserais un wrapper nullable autour du type enum, par exemple.

[Parameter(Mandatory = false)]
public MyEnum? IsEnabled { get; set; }

Notez le? modificateur sur MyEnum. Ensuite, vous pouvez tester s'il est défini comme suit:

if (this.IsEnabled.HasValue) { ... }

Autres conseils

À part PowerShell, il n’est jamais bon d’utiliser le 0 de cette façon. Vous devez toujours utiliser 0 pour la valeur par défaut la plus appropriée. Dans ce cas, la valeur par défaut la plus appropriée devrait être quelque chose comme "Unset".

En fin de compte, cela n’a rien à voir avec PowerShell ni avec les bonnes pratiques de codage pour .NET.

  • Oisin

Comme option, vous pouvez utiliser la collection $ PSBoundParameters pour vérifie si passé à la méthode.

Supposons que nous ayons un fichier json du type suivant {"p1": "valeur1", "p2": "valeur2". } et nous voulons créer une fonction qui accepte le paramètre p1 et p2 et met à jour la valeur de p1 et p2 dans le fichier, s'ils sont passés à la fonction. Supposons que ces valeurs peuvent être null et que ces valeurs aient la valeur null ne revient pas à ne pas les transmettre.

Par exemple, Update-Values ??-p1 $ null doit mettre à jour p1 en null et ne doit pas changer p2 . .

Pour ce faire, nous devrions pouvoir détecter si le paramètre a été passé à la méthode ou non.

Exemple - Comment détecter si un paramètre est passé, pour un paramètre facultatif pouvant accepter la valeur NULL?

Function Update-Values ($p1, $p2) {
    If($PSBoundParameters.ContainsKey("p1")) {
        Write-Host "p1 passed"
    }
    else {
        Write-Host "p1 not passed"
    }
    If($PSBoundParameters.ContainsKey("p2")) {
        Write-Host "p2 passed"
    }
    else {
        Write-Host "p2 not passed"
    }
}

Ensuite, si vous exécutez la fonction en utilisant le paramètre suivant:

Update-Values -p1 $null
# Update-Values -p1 "something"

En conséquence, vous verrez:

p1 passed
p2 not passed

Vous pouvez lire l'article du blog ici: Comment déterminer si un paramètre est transmis à une applet de commande Powershell .

La seule chose que je peux voir est de modifier votre enum afin que la valeur 0 soit nommée Unknown ou quelque chose comme ça.

Le problème est que les énumérations ne sont que des entiers en arrière-plan et que les entiers sont des types valeur. Conséquence regrettable, ils doivent avoir une valeur et cette valeur est 0 par défaut.

Je sais que ce fil est un peu vieux maintenant, mais la meilleure façon de le faire est de déclarer votre paramètre en utilisant le type SwitchParameter. Ensuite, vos utilisateurs ne doivent pas passer -IsEnabled, ils ajouteraient simplement quelque chose comme -Enabled en tant que paramètre.

Vous testez ensuite la propriété .IsPresent de votre paramètre pour voir si l'appelant a ajouté -Enabled à l'appel de la cmdlet.

bool wasSpecified = MyInvocation.BoundParameters.ContainsKey("IsEnabled");
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top