2

如果我运行以下命令:

Measure-Command -Expression {gci -Path C:\ -Recurse -ea SilentlyContinue | where Extension -eq ".txt"}
Measure-Command -Expression {gci -Path C:\ -Filter *.txt -Recurse -ea SilentlyContinue}

第二个表达式总是比第一个更快,我猜是因为它不必使用管道。

我想也许在 Pipeline 方法中,PowerShell 递归了我的驱动器并将一组对象传递给 where 子句,这将不得不再次遍历这些项目,但我排除了这一点,因为如果你运行第一个表达式,你可以看到它返回输出,因为它是递归的。那么为什么 Pipeline 方法比较慢呢?

4

2 回答 2

5

使用Where-Object总是比使用左侧命令的内置参数慢。您首先将所有对象带到您的外壳,然后才开始过滤它们(客户端过滤)。

关于 -Filter 参数,它的工作速度更快,因为它在提供程序级别(服务器端过滤)执行,一旦访问对象就会被检查,并且您只取回与您的条件匹配的对象。

于 2012-08-27T09:06:41.300 回答
0

谢伊的回答是完全正确的。不过,我想谈谈你的次要问题。以下是管道中正在发生的事情:

gci -Path C:\ -Recurse -ea SilentlyContinue | where Extension -eq ".txt"

gci将开始搜索位于或下的文件和目录c:\,任何扩展名。当它找到每个结果时,将一个结果传递给Where-Object,如果扩展名不是 ,它将丢弃它.txt。如果扩展名是.txt,则该对象在管道中传递,并输出到控制台(或变量,或其他)。然后gci将继续搜索,当它找到下一个文件时,它将传递它,等等。因此,尽管搜索整个驱动​​器可能需要几分钟,但c:\您几乎可以立即获得部分结果,因为管道正在运行一次一个对象。

没有发生的是gci一次进行全盘搜索,然后Where-Object仅在完成时才将完整的结果集传递给它。

于 2012-08-27T17:00:42.597 回答