如果我运行以下命令:
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 方法比较慢呢?
最佳答案
使用 Where-Object
总是比使用左侧命令的内置参数慢。您首先将所有对象放入 shell,然后才开始过滤它们(客户端过滤)。
关于 -Filter 参数,它的工作速度更快,因为它在提供程序级别执行(服务器端过滤),对象在访问后就会被检查,并且您只返回符合您条件的对象。
关于PowerShell管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138799/