PowerShell Select-Object中-Unique与First等限制参数的执行顺序疑问
Select-Object 组合
-Unique 与限制类参数的执行顺序问题 我想确认是否遗漏了相关官方文档,或是存在其他更优的实现方式可以规避该问题,难道只有我尝试使用Select-Object从数据集中选取前X个唯一实例?
根据测试结果,当Select-Object同时使用-Unique开关和-First、-Last、-Skip、-Index等限制类参数时,限制逻辑会优先执行,之后才会进行去重操作,这一执行顺序不符合预期,且目前没有找到相关文档说明该规则。
举个简单示例:构造一个包含20个元素的数组,每个元素重复出现2次,代码如下:
PS > $array = @() ; 1..10 | % { $array += $_ ; $array += $_ } PS > $array -Join ',' 1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10 # 数组用逗号分隔展示为一行
假设拿到上述$array,最多只能处理5个对象,优先使用Select-Object筛选。第一次获取到5个对象但存在重复项,添加-Unique开关后输出仍不符合预期:
PS > ($array | Select-Object -First 5) -Join ',' 1,1,2,2,3 # 符合预期返回5个对象,但存在重复 PS > ($array | Select-Object -Unique -First 5) -Join ',' 1,2,3 # 无重复,但返回数量少于预期的5个
期望的结果是Select-Object先执行去重,再返回指定数量的结果。虽然该执行逻辑本身不存在错误,但目前Select-Object采用的运算顺序没有任何文档说明-Unique开关是在cmdlet执行的最后阶段才生效的。
要实现预期效果,需要分开两次调用Select-Object,先去重再取前N个,代码如下:
PS > ($array | Select-Object -Unique | Select-Object -First 5) -Join ',' 1,2,3,4,5 # 符合预期结果,返回5个无重复的对象
内容的提问来源于stack exchange,提问作者immobile2
相关产品推荐
相关产品推荐

