【问题标题】:PowerShell Sort-Object always returns System.Object[]PowerShell Sort-Object 始终返回 System.Object[]
【发布时间】:2015-09-22 08:43:16
【问题描述】:

我在 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>,但我认为应该有更好的解决方案,因为我需要稍后修改集合并且数组很痛苦。

【问题讨论】:

    标签: sorting powershell


    【解决方案1】:

    这就是管道的工作原理:

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

    【讨论】:

    • 我同意它没有看到列表。这就是为什么我希望输出是System.String[] 类型的原因,因为每个单独对象的类型都是System.String。但也许这是一个文档问题(或者我没有正确理解)。
    • @Scoregraphic 您是否希望 PowerShell 会检查每个返回项目的类型并创建具有最常见的最派生类型作为元素类型的数组?而且,顺便说一句,退回的物品可能会被包裹在PSObject中,所以它不能是System.String[]
    • 不是每个项目,而是第一个项目,并使用此类型信息来创建输出类型。在我写这篇文章时,我发现如果你从List<object> 中输入对象,这会产生问题。然而,文档具有误导性。
    【解决方案2】:

    除了@PetSerAl 所说的,这应该可行;

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

    如果它的实现方式与您在此处显示的方式不同,您可能必须使用 -OutVariable +SortedAssemblyNames 才能不覆盖值(变量名前面的 +)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多