首页 > 解决方案 > 如何在不使用引号的情况下保留字符串数组参数中的尾随零

问题描述

当数组元素的值包含点时, PowerShell 会删除该值的尾随零。除非我将值括在引号中。不幸的是,我需要保留尾随零,并且脚本用户无法可靠地使用引号。

如何强制 PowerShell 保留尾随零?

将参数强烈键入为 [string[]] 并不能解决问题。

例子:

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

标签: arrayspowershellparameters

解决方案


如果调用者未将其放在引号中,则您无法保留该 0。事实是这些值将被解释为数字,因为它们符合数字文字的模式。

因此,如果您无法更改调用者的行为,那么它们在进入您的函数之前将是数字。您的[string[]]演员会将数字转换为字符串,但此时它已经是一个数字并且将遵循number -> string规则。

PowerShell 在类型转换方面非常宽松,或者更确切地说,当存在不匹配时,它会努力成功转换类型,因此在这种情况下也很难抛出错误(您无权访问原始值知道任何错误,因为这发生在参数绑定期间)。

你可以这样做:

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

它会强制传入的值已经是 a [string],这对于字符串转换有用的所有其他情况来说是很糟糕的。


推荐阅读