PowerShell中非连续数值范围的存在性检查失败问题
PowerShell中非连续数值范围的存在性检查失败问题
嗨,我来帮你搞清楚这个问题出在哪~
你遇到的核心问题是:你写的(1..10),12,15,(30..45),50,53并不是一个扁平的数字集合,而是一个嵌套的数组结构。具体来说,PowerShell会把它解析成一个包含多个元素的数组:其中元素是1..10这个数组、整数12、整数15、30..45这个数组、整数50、整数53。
而-contains和-in这两个操作符,是用来检查顶层集合里是否存在完全匹配的元素。你要查的是数字4,但顶层集合里根本没有4这个元素(顶层元素是数组和单个数字),所以自然返回False。
解决方法:把嵌套结构扁平化成单一层级的数字集合
你需要把所有范围和单个数字合并成一个没有嵌套的数组,这样存在性检查就能正常工作了,这里有几种常用的方式:
方法1:用+运算符拼接所有部分
直接把每个范围和数字用+连接,PowerShell会自动把它们合并成一个扁平数组:
# 创建扁平的数字集合 $myNumbers = (1..10) + 12 + 15 + (30..45) + 50 + 53 # 现在检查就会得到正确结果 4 -in $myNumbers # 返回 True $myNumbers -contains 4 # 返回 True
方法2:用管道展开嵌套集合
如果已经有了嵌套的结构,可以通过ForEach-Object来展开所有嵌套的数组,得到扁平集合:
$myNumbers = (1..10),12,15,(30..45),50,53 | ForEach-Object { $_ } # 检查存在性 4 -in $myNumbers # 返回 True
方法3:直接在检查时展开(无需提前存变量)
如果不想提前定义变量,也可以把展开操作直接写到检查语句里:
4 -in ((1..10),12,15,(30..45),50,53 | ForEach-Object { $_ }) # 返回 True
补充说明:为什么直接输出会显示所有数字?
你直接输入(1..10),12,15,(30..45),50,53时,PowerShell会逐个输出数组里的每个元素:先输出1..10这个数组的所有元素,然后依次输出12、15、30..45的所有元素、50、53。但这只是输出时的展开显示,实际存储的仍然是嵌套的数组结构,不是扁平的集合,所以检查时不会匹配到单个数字。
备注:内容来源于stack exchange,提问作者seagull
相关产品推荐
相关产品推荐

