PowerShell Sort-Object始终返回System.Object []

时间:2015-09-22 08:43:17

标签: sorting powershell

我在PowerShell中创建了一个List<string>,并希望使用带有以下代码的脚本块对此列表进行排序:

$AssemblyNames = New-Object "System.Collections.Generic.List[string]"
$AssemblyNames.Add("PersonService.BizTalk.dll")
$AssemblyNames.Add("PersonService.BizTalk.Schemas.dll")
$SortedAssemblyNames = $AssemblyNames | Sort-Object { if ($_.ToLower().Contains("schema")) { 0 } else { 1 } }
$SortedAssemblyNames

输出:

PersonService.BizTalk.Schemas.dll
PersonService.BizTalk.dll

一切都很好,但我想在以后使用以下方法删除一些元素:

$SortedAssemblyNames.Remove($SortedAssemblyNames.Item($i))

这会产生错误

  

使用“1”参数调用“删除”的异常:“集合具有固定大小。

所以我检查了$SortedAssemblyNames变量的类型,得到了System.Object[]。这很奇怪,因为Sort-Object文档声明:

  

输出

     

输出类型是cmdlet的对象类型   发射。

在我看来,这应该是System.String[]。我错了还是有办法指定Sort-Object cmdlet的输出类型?

我目前的解决方法是遍历此集合并将其添加到新的List<string>,但我认为应该有更好的解决方案,因为我需要稍后修改集合并且数组很痛苦。

2 个答案:

答案 0 :(得分:1)

这是管道的工作方式:

  • Sort-Object没有看到您的列表。您的列表由PowerShell枚举,每个项目都传递给Sort-Object
  • Sort-Object不返回数组。 Sort-Object将每个项目写入管道。 PowerShell看到,该管道返回多个项目并将它们打包成阵列。
  • 当PowerShell需要将多个管道结果打包到数组中时,它始终会创建System.Object[]数组。它不会尝试找到常见的大多数派生元素类型的数组。

答案 1 :(得分:1)

除了@PetSerAl所说的,这应该有效;

$AssemblyNames | Sort-Object { if ($_.ToLower().Contains("schema")) { 0 } else { 1 } } -OutVariable SortedAssemblyNames
$SortedAssemblyNames.Remove($SortedAssemblyNames.Item($i))

如果以不同于此处显示的方式实施,则可能必须使用-OutVariable +SortedAssemblyNames才能覆盖值(变量名称的前面+)。