PowerShell中gci命令带-filter参数比无该参数性能更好的原因是什么
PowerShell两条Get-ChildItem命令性能差异原因
- 首先确认参数对应关系:你用到的
gci是Get-ChildItem的别名,其中gci -r *.txt里的*.txt默认作为-Include参数的位置传值,gci -r -filter *.txt则是显式指定了-Filter参数,二者的过滤逻辑完全不同。 - 过滤执行层级的差异是性能差距的核心原因:
- 带
-Include的命令,过滤操作在PowerShell运行时层面完成:命令会先递归扫描目标路径下的所有文件和目录,把所有扫描到的文件全部封装成PowerShell对象后,再逐一匹配*.txt的通配符规则,丢弃不符合要求的对象。整个过程需要完成全量文件遍历、大量对象创建、二次规则匹配三步操作,文件数量越多、目录层级越深,开销就越大,执行速度自然更慢。 - 带
-Filter的命令,过滤操作在底层文件系统层面完成:PowerShell会直接把*.txt的过滤规则传递给Windows文件系统API,由文件系统驱动直接完成过滤,仅把符合规则的文件返回给PowerShell。不需要遍历全量文件,也不需要额外创建无用的对象做二次匹配,执行开销极低,所以速度快很多。
- 带
- 额外提示:
-Filter的通配符语法由底层文件系统定义,和PowerShell原生通配符语法有细微差别,但日常使用的*.xxx这类后缀匹配规则完全兼容,绝大多数场景下优先使用-Filter参数都能获得更优的执行性能。
内容的提问来源于stack exchange,提问作者Sake
相关产品推荐
相关产品推荐

