当该值包含点时,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
答案 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