如何在不使用引号的情况下保留字符串数组参数中的尾随零

时间:2019-04-13 04:26:13

标签: arrays powershell parameters

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

如何强制PowerShell保留尾随零?

  • 数组元素格式为 Number.Number
  • 数组元素可能具有1到n个尾随零
  • 单个元素数组保留尾随零
  • 多元素数组删除结尾的零

严格将参数键入为[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

3 个答案:

答案 0 :(得分:2)

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

因此,如果您无法更改呼叫者的行为,那么在进入您的功能之前,它们将是数字。您的[string[]]类型转换会将数字转换为字符串,但此时已经是数字,并且将遵循number -> string规则。

PowerShell在类型转换方面非常宽大,或者说,它会在不匹配时尝试成功地成功转换类型,因此在这种情况下也将很难引发错误(您无权访问原始值知道什么是错误的,因为这是在参数绑定期间发生的。

您可以这样做:

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

这将强制传入的值已经是[string],这对于所有其他需要转换字符串的情况都是很糟糕的。

答案 1 :(得分:1)

我使用briantist,为减少引用,您可以拆分一个字符串:

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

> 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

答案 2 :(得分:1)

这个技巧怎么样。没有逗号,没有引号,仍然得到一个数组并按原样维护所有项目,就像这样……

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