2
votes

Comment conserver les zéros de fin dans le paramètre de tableau de chaînes sans utiliser de guillemets

PowerShell supprime le zéro final de la valeur d'un élément de tableau lorsque cette valeur contient un point . Sauf si je place la valeur entre guillemets. Malheureusement, je dois conserver le zéro de fin et les utilisateurs du script ne parviennent pas à utiliser les guillemets de manière fiable.

Comment puis-je contraindre PowerShell à conserver le zéro de fin?

  • Le format de l'élément du tableau est Number.Number
  • L'élément du tableau peut avoir 1 à n zéros à la fin
  • Les tableaux à un seul élément conservent les zéros de fin
  • Les tableaux à plusieurs éléments suppriment les zéros de fin

Taper fortement le paramètre comme [string []] ne résout pas le problème.

Exemple:

function Get-Customer {
    Param 
    ( 
        [string[]]$CustomerId
    )
    $CustomerId
}

> Get-Customer -CustomerId 654.1,654.10,654.1721,654.1720
654.1    #CORRECT
654.1    #INVALID
654.1721 #CORRECT
654.172  #INVALID


0 commentaires

3 Réponses :


2
votes

Vous ne pouvez pas conserver ce 0 si l'appelant ne le met pas entre guillemets. Le fait est que ces valeurs seront interprétées comme des nombres parce qu'elles correspondent au modèle des littéraux numériques.

Donc, si vous ne pouvez pas changer le comportement de votre appelant, ce seront des nombres avant même qu'ils n'entrent dans votre fonction. Votre cast de [string []] convertira le nombre en chaîne, mais c'est déjà un nombre à ce stade et suivra les règles de number -> string .

PowerShell est très indulgent en ce qui concerne la conversion de type, ou plutôt, il s'efforce de convertir avec succès les types en cas d'incohérence, il sera donc difficile de lancer une erreur dans ce cas également (vous avez aucun accès aux valeurs d'origine pour savoir que quelque chose ne va pas car cela se produit lors de la liaison de paramètres).

Vous pouvez faire ceci:

function Get-Customer {
    Param 
    ( 
        [ValidateScript({
            $_ -is [string]
        })]
        [object[]]$CustomerId
    )
    $CustomerId
}

Cela forcerait le les valeurs transmises sont déjà une [string] , ce qui est nul pour tous les autres cas où la conversion de chaîne aurait été utile.


1 commentaires

Dommage. Merci pour l'explication concise et utile. Au moins avec votre solution, je pourrais immédiatement alerter l'appelant lorsque les devis ne sont pas utilisés.



1
votes

Je suis avec briantist , pour réduire les guillemets, vous pouvez diviser une chaîne:

> Get-Customer -CustomerId '654.1,654.10,654.1721,654.1720',"1.000,2.00"
654.1
654.10
654.1721
654.1720
1.000
2.00

function Get-Customer {
    Param 
    ( 
        [ValidateScript({
            $_ -is [string]
        })]
        [object[]]$CustomerId
    )
    $CustomerId -split ','
}


1 commentaires

Oui, cela pourrait aider à réduire le fardeau de mon appelant de script. Merci!



1
votes

Et cette astuce. Pas de virgule, pas de guillemets, toujours obtenir un tableau et conserver tous vos éléments tels quels, comme ceci ...

function Get-CustomerId 
{ $args }
New-Alias -Name cid -Value Get-CustomerId 
cid 654.1 654.10 654.1721 654.1720

# Results

654.1
654.10
654.1721
654.1720


0 commentaires