gpt4 book ai didi

Powershell数组的ForEach不返回System.array?

转载 作者:行者123 更新时间:2023-12-03 08:12:07 24 4
gpt4 key购买 nike

我注意到,当在数组对象上运行 ForEach 并将输出捕获到新变量时,新变量不是 System.array 类型:

PS D:\Playground> $Arr = 1, 2, 3
PS D:\Playground> $Arr2 = $Arr.ForEach({$_})
PS D:\Playground> $Arr2.Gettype()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Collection`1 System.Object

相反,它的类型是Collection'1

这是什么类型?它相当于一个数组吗?

顺便说一句,这与 ForEach-Object 不同:

PS D:\Playground> $Arr3 = $($Arr | ForEach-Object { $_ })
PS D:\Playground> $Arr3.GetType()

IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array

最佳答案

让我以 Jeroen Mostert 为基础的精彩评论:

  • .ForEach() array method ,及其姊妹方法,.Where() ,返回[System.Collections.ObjectModel.Collection[psobject]] 集合实例而不是常规 PowerShell 数组 ([object[]])。

    • 与相关的ForEach-Object不同/Where-Object cmdlet这些方法总是返回一个集合,即使只有一个单个对象 :

      # .ForEach() method:
      # Collection result even with single object.
      @(1).ForEach({ $_ }).GetType().Name # -> Collection`1

      # ForEach-Object cmdlet:
      # Single output object: received as-is.
      (@(1) | ForEach { $_ }).GetType().Name # -> Int32
      # Two or more output objects: array result (if captured / used in expression)
      (1, 2 | ForEach { $_ }).GetType().Name # -> Object[]
    • 注意:这些方法是 intrinsic members 的示例,即 PowerShell 在所有对象上公开的属性和方法,无论其类型如何(除非类型 native 成员存在同名的,优先)。

  • 本质上,此集合类型在 PowerShell 中表现得像数组(由于实现了 [System.Collections.Generic.IList[psobject]] 接口(interface)):

    • 它的元素在管道中枚举,就像数组的元素一样。
    • 支持位置索引(例如 [0]),就像数组一样。
    • 与数组不同,但是:
      • 可以调整大小;也就是说,它的实例允许您添加 (.Add()) 和删除 (.Remove()) 元素。
      • 其元素类型为[psobject] (不是 [object] ),通常不可见的帮助器类型能够包装任何.NET对象,PowerShell(大部分)在幕后使用它。
        • 通常情况下,这种差异并不重要,但不幸的是,在某些边缘情况下,这种差异会很重要 - 请参阅 GitHub issue #5579 .

.ForEach()方法ForEach-Object cmdlet:

注意:以下内容类似地适用于 .Where()Where-Object

  • 命令输出上使用ForEach-Object,以便从PowerShell管道的行为中受益(一逐一处理,因为正在接收输入,不需要预先收集输入);例如:

    Get-ChildItem -Name *.txt| ForEach-Object { "[$_]" }
  • 对已经/可以首先作为一个整体收集到内存中的数组(集合)使用 .ForEach()(如果速度更快) 需要处理;例如:

    ('foo.txt', 'bar.txt').ForEach({ "[$_]" })

注意所讨论的单对象行为和输出集合类型的差异然而,上面。

参见this answer有关 .ForEach()ForEach-Object 的详细并置,foreach statement ,以及member-access enumeration .

关于Powershell数组的ForEach不返回System.array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70533327/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com