我注意到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
uj5u.com熱心網友回復:
讓我以Jeroen Mostert的精彩評論為基礎:
該
.ForEach()陣列的方法,和它的姊妹方法.Where(),回傳[System.Collections.ObjectModel.Collection[psobject]]集合實體,而不是普通的PowerShell陣列([object[]])。不同于現有
ForEach-Object/ cmdlet的,這些方法總是回傳一個集合,即使只有一個單一的物件:Where-Object# .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[]注意:這些方法是內在成員的示例,即PowerShell 在所有物件上公開的屬性和方法,而不管它們的型別(除非存在同名的型別本機成員,這優先)。
本質上,此集合型別的行為類似于PowerShell 中的陣列(由于實作了
[System.Collections.Generic.IList[psobject]]介面):- 它的元素在管道中被列舉,就像陣列的元素一樣。
[0]與陣列一樣,支持位置索引(例如)。- 然而,與陣列不同的是:
- 它是可調整大小的;也就是說,它的實體允許您添加 (
.Add()) 和洗掉 (.Remove()) 元素。 - 它的元素型別是
[psobject](not[object]),通常是不可見的輔助型別,能夠包裝任何 .NET 物件,PowerShell(主要)在幕后使用它。- 通常,這種差異無關緊要,但是 - 不幸的是 - 存在邊緣情況 - 請參閱GitHub 問題 #5579。
- 它是可調整大小的;也就是說,它的實體允許您添加 (
該.ForEach() 方法與cmdletForEach-Object :
注意:以下內容類似地適用于.Where()vs. Where-Object.
ForEach-Object在命令輸出上使用,以便從PowerShell 管道的流式行為中受益(逐一處理,在接收輸入時,無需預先收集輸入);例如:Get-ChildItem -Name *.txt| ForEach-Object { "[$_]" }如果需要更快的處理,則在已經存在的
.ForEach()陣列(集合)上使用/可以首先在記憶體中作為一個整體收集;例如:('foo.txt', 'bar.txt').ForEach({ "[$_]" })
但是,請注意上面討論的單物件行為和輸出集合型別的差異。
有關, 、陳述句以及成員列舉的詳細并列,請參閱此答案。.ForEach()ForEach-Objectforeach
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/399962.html
標籤:电源外壳
