Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting PowerShell排序对象始终返回System.Object[]_Sorting_Powershell - Fatal编程技术网

Sorting PowerShell排序对象始终返回System.Object[]

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

我已在PowerShell中创建了一个
列表
,并希望使用具有以下代码的脚本块对该列表进行排序:

$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[]
。不是每个项目,而是第一个项目,并使用此类型信息创建输出类型。在我写这篇文章时,我发现如果您从
列表中输入对象,这将产生问题。不过,文档有误。