PowerShell中Sort-Object返回字符串而非数组,如何使其返回数组?
解决Sort-Object返回字符串而非数组的问题
问题出在PowerShell的自动拆包行为:当Sort-Object -Unique的结果仅包含单个元素时,PowerShell会自动将集合拆包为标量值(也就是单个字符串),而非保留数组结构。
有三种简单的解决方式:
1. 强制转为数组(兼容所有PowerShell版本)
用@()包裹排序结果,强制将输出转为数组,无论结果有多少元素:
$myprogs = Get-ChildItem D:\MyPath\MyPrograms $myprognames = foreach ($i in $myprogs) { $i.FullName -replace "D:\\MyPath\\MyPrograms\\", "" } $myprognames = @($myprognames | Sort-Object -Unique) # 此时$myprognames始终是数组,即使只有一个元素 $myprognames
2. 使用-AsArray参数(PowerShell 7及以上版本可用)
PowerShell 7+为Sort-Object新增了-AsArray参数,直接强制返回数组:
$myprogs = Get-ChildItem D:\MyPath\MyPrograms $myprognames = foreach ($i in $myprogs) { $i.FullName -replace "D:\\MyPath\\MyPrograms\\", "" } $myprognames = $myprognames | Sort-Object -Unique -AsArray $myprognames
3. 提前初始化数组变量
在赋值前先将$myprognames初始化为空数组,确保后续赋值不会丢失数组结构:
$myprogs = Get-ChildItem D:\MyPath\MyPrograms $myprognames = @() foreach ($i in $myprogs) { $myprognames += $i.FullName -replace "D:\\MyPath\\MyPrograms\\", "" } $myprognames = $myprognames | Sort-Object -Unique $myprognames
验证方式:执行$myprognames.GetType().Name,如果输出是Object[]则说明是数组,String则是单个字符串。
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

