Sorting PowerShell排序对象始终返回System.Object[]
我已在PowerShell中创建了一个Sorting PowerShell排序对象始终返回System.Object[],sorting,powershell,Sorting,Powershell,我已在PowerShell中创建了一个列表,并希望使用具有以下代码的脚本块对该列表进行排序: $AssemblyNames = New-Object "System.Collections.Generic.List[string]" $AssemblyNames.Add("PersonService.BizTalk.dll") $AssemblyNames.Add("PersonService.BizTalk.Schemas.dll") $SortedAssemblyNames = $Assem
列表
,并希望使用具有以下代码的脚本块对该列表进行排序:
$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”参数调用“Remove”时出现异常:“集合大小固定
因此,我检查了$SortedAssemblyNames
变量的类型,得到了System.Object[]
。这很奇怪,因为排序对象
文档说明:
输出
输出类型是cmdlet支持的对象的类型
发射
在我看来,这应该是System.String[]
。是我错了还是有办法指定Sort-Object
cmdlet的输出类型
我目前的解决办法是循环使用此集合,并将其添加到新的
列表中,但我认为应该有更好的解决方案,因为我以后需要修改集合,数组是一个难题。这就是管道的工作方式:
排序对象
看不到您的列表。您的列表由PowerShell枚举,每个项目都传递给排序对象
排序对象
不返回数组。排序对象
将每个项目写入管道。PowerShell看到,管道返回多个项目并将其打包到数组中
- 当PowerShell需要将多个管道结果打包到数组中时,它总是创建
System.Object[]
array。它不会尝试查找数组中最常见的派生元素类型
除了@PetSerAl所说的,这应该是可行的
$AssemblyNames | Sort-Object { if ($_.ToLower().Contains("schema")) { 0 } else { 1 } } -OutVariable SortedAssemblyNames
$SortedAssemblyNames.Remove($SortedAssemblyNames.Item($i))
如果它的实现方式与您在这里展示的不同,您可能必须使用-OutVariable+SortedAssemblyNames
,以避免覆盖值(变量名称前面的“+”)。我同意它没有看到列表。这就是为什么我希望输出类型为System.String[]
因为每个对象的类型都是System.String
。但这可能是文档问题(或者我没有正确理解它).@Scoregraphic您是否希望PowerShell检查每个返回项的类型,并使用最常见的派生类型作为元素类型创建数组?顺便说一句,返回项可能会包装在PSObject
中,因此它不能是System.String[]
。不是每个项目,而是第一个项目,并使用此类型信息创建输出类型。在我写这篇文章时,我发现如果您从列表中输入对象,这将产生问题。不过,文档有误。