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?
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
3 Réponses :
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.
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.
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 ',' }
Oui, cela pourrait aider à réduire le fardeau de mon appelant de script. Merci!
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