在 PoweShell 2 中,我们做了:
Get-ChildItem | ForEach-Object {$_.LastWriteTime} | Sort-Object
在 Powershell 3 中,我们这样做:
(Get-ChildItem).LastWriteTime | Sort-Object
但是它是如何工作的,我在 MSDN 上阅读了这篇博文,他们说它更快,因为 foreach 循环没有运行?那么它如何枚举属性呢?
在 PoweShell 2 中,我们做了:
Get-ChildItem | ForEach-Object {$_.LastWriteTime} | Sort-Object
在 Powershell 3 中,我们这样做:
(Get-ChildItem).LastWriteTime | Sort-Object
但是它是如何工作的,我在 MSDN 上阅读了这篇博文,他们说它更快,因为 foreach 循环没有运行?那么它如何枚举属性呢?
PowerShell 正在为我们做艰苦的工作,它在内部循环集合。我喜欢称其为“隐式 foreach”。假设您指定的成员存在于每个对象上,如果您指定的成员是一个属性,您将取回它的值。如果它是一个方法,它会调用每个对象的方法。
在 v2 中,要获取所有进程名称,您必须自己处理循环:
Get-Process | Foreach-Object {$_.Name}
在 v3 中,等价于:
(Get-Process).Name
同样适用于方法。要杀死名称以 note* 开头的所有进程:
(Get-Process note*).Kill()
博客说 foreach-object cmdlet 没有运行。现在它由语言引擎而不是 cmdlet 来处理,从而使其更快。它究竟是如何工作的是内部实现细节,我认为这不是你真正想知道的。