PowerShell单值数组使用Get-Unique时字符串被拆分问题求解
PowerShell 单元素数组管道处理异常问题解答
问题原因
- PowerShell 管道默认存在单元素集合自动展开机制:仅包含1个元素的数组通过管道传递时,会被自动解包为单个字符串对象,不再保留数组结构
- 字符串实现了
IEnumerable接口,Get-Unique、Sort-Object等支持集合处理的命令,接收到单个可枚举对象时,会默认枚举其内部元素(即字符串的每一个字符)进行运算,最终返回结果为字符数组,因此按下标取值时会得到单个字符 - 多元素数组通过管道时会被展开为多个独立的字符串对象,命令直接处理字符串集合,因此运行符合预期
规避解决方法
方法1:强制接收结果为数组
使用数组包裹运算符@()包裹整个赋值逻辑,无论管道返回单个值还是多个值,最终结果都会被封装为数组:
# 单元素场景正常运行 $t = @(@("asd") | Get-Unique) # 多元素场景兼容 $t = @(@("asd","bcd") | Get-Unique)
执行后$t[0]将返回完整的asd字符串。
方法2:禁止管道枚举输入数组
使用Write-Output的-NoEnumerate参数,强制数组作为整体传递给下游命令,不会被展开:
$t = Write-Output @("asd") -NoEnumerate | Get-Unique
方法3:直接通过参数传值
不使用管道传递输入,直接将数组赋值给命令的InputObject参数,不会触发自动枚举逻辑:
# Get-Unique 用法 $t = Get-Unique -InputObject @("asd") # Sort-Object 带去重参数用法 $t = Sort-Object -InputObject @("asd") -Unique
内容的提问来源于stack exchange,提问作者András Müller
相关产品推荐
相关产品推荐

