成员枚举在PowerShell 3中如何工作



在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

方法也是如此。要终止名称以注释*开头的所有进程:

(Get-Process note*).Kill()

博客说foreach对象cmdlet没有运行。现在它由语言引擎而不是cmdlet来处理,使它更快。它的实际工作方式是内部实现细节,我认为这不是你真正想知道的。

最新更新