我在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>
,但我认为应该有更好的解决方案,因为我需要稍后修改集合并且数组很痛苦。
答案 0 :(得分:1)
这是管道的工作方式:
Sort-Object
没有看到您的列表。您的列表由PowerShell枚举,每个项目都传递给Sort-Object
。Sort-Object
不返回数组。 Sort-Object
将每个项目写入管道。 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
才能覆盖值(变量名称的前面+)。