我有一个接受电话号码列表作为参数的小程序。一些电话号码的第一个字符是0。当我用一个数字调用函数时,字符串保持不变。当我用2+数字调用函数时,前导零被修剪
function user {
[CmdletBinding()]
param (
[Parameter(mandatory,position=0)]
[string[]]
$numbers
)
process {
$numbers
$users = @{
'0600000001' = 'user1'
'0600000002' = 'user2'
}
foreach($key in $users.keys) {
if($numbers -contains $key) {
write-host $users[$key]
}
}
}
}
字符串
例如,在一个实施例中,
[PS] D:\> user 0600000001
0600000001
user1
[PS] D:\> user 0600000002
0600000002
user2
型
但
[PS] D:> user 0600000001,0600000002
600000001
600000002
型
当然,如果我在数字周围加上引号,它会像预期的那样工作
[PS] D:\> user '0600000001','0600000002'
0600000001
0600000002
user2
user1
型
但是这个小工具不适合我的使用,用户非常喜欢忘记在参数周围加上引号。
我在谷歌上搜索了一下,发现了很多关于PS篡改前导零字符串的帖子/文章,但没有找到如何防止它的解决方案。
你有什么线索吗
编辑
该真实的小字符串具有关于电话号码的模式验证,并且被修剪的前导零中断该验证小字符串
function user {
[CmdletBinding()]
param (
[Parameter(mandatory,position=0)]
[ValidatePattern('^(\+33|0[67])\d{8}|\+(?!33)\d+$')]
[string[]]
$numbers
)
.
.
.
}
型
1条答案
按热度按时间ql3eal8s1#
我认为你观察到的行为是**一个 bug,它已经在GitHub issue #20717中报告过了:
[int]
,同时 * 还保留原始字符串表示 *,以防目标命令最终 not 期待一个数字。0600000001
、2.3
、0xA
、1e2
,甚至1l
或1d
(数字类型后缀)+
或-
开头的标记 * 不会 * 被解析为数字,并且仍然是 * 字符串 *([string]
)。[int]
) Package 在一个 * 不可见的[psobject]
Package 器 * 中来实现,该 Package 器缓存原始字符串表示;后者可以通过调用.psobject.ToString()
来检索-但 * 不是 * 使用.ToString()
和 * 不是 * 通过可扩展字符串("..."
)中的字符串插值来检索。.psobject.ToString()
在以下场景中被 * 隐式 * 调用:0xA
)转换为10
是不合适的。[string]
时[object[]]
类型的,即它的元素可以存储 * 任何类型 * 的值)。user 0600000001,0600000002
调用中,0600000001,0600000002
* 不是 * 在 * 表达式(解析)模式 * 下解析的-它仍然是在 * 参数模式 * 下解析的,其中,
* 也 * 支持数组构造(除了调用 * 外部程序 * 时,其中不存在数组的概念),* 元素 * 的解析方式与 * 单个 * 参数模式参数相同。Write-Output foo, bar
是全参数模式的等价物,Write-Output ('foo', 'bar')
,即带有 * 嵌套表达式 * 的参数模式语句。为了简洁地演示问题:
字符串
这将输出以下内容,显示参数
042
被解析为值为42
的[int]
,但 Package 在具有缓存的原始字符串表示的[psobject]
示例中:型
转换到这样的参数的 * 数组 * 表明这种 Package 是 * 丢失 *:
传递
042, 043, +44, -45
而不是042
得到:型
注意
042
和043
的原始字符串表示是如何丢失的,而+44
和-45
-由于它们的前缀-被解析为开始的 * 字符串 *。注意事项:
[object]
类型的参数,它允许在没有显式类型转换的情况下检查行为。[object[]]
(又名[Array]
),即使在 single-argument的情况下,原始的字符串表示也会丢失,这本身可以被认为是一个bug。[string[]]
类型的参数,如您的问题所示,它确实适用于 * 单 * 参数情况,但在多参数情况下失败,因为在构建[string[]]
数组时,原始字符串表示已经丢失,因为丢失发生在初始的幕后,必然是基于[object]
的数组解析。