2017-09-25 50 views
1

最近我创建通过PowerShell的有关地处C:\Windows\winsxs文件夹unsing的Get-ChildItemFilter参数*.inf文件报告(见官方文档大约this cmdlet and its parameters),如:Get-ChildItem实现过滤器参数中的FileSystem Provider错误?

$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Filter *.inf -Recurse 

但是我已经注意到了这一点,结果中也包含具有其他文件扩展名的文件,如.inf_loc.inf_dbf42768

在另一方面,Include参数正常工作,只返回.inf文件:

$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Include *.inf -Recurse 

我用PS版3和4测试的现象,结果发现,如果你的扩展正在寻找具有正好3个字符的文件,即使这些文件具有更长的扩展名,也会返回以相同的3个字符开头的扩展名。如果您要查找的分机短于或长于3个字符,根据我的经验,至少没有这样的问题。

虽然表现在我的情况并不重要,因为据我所知,使用Filter参数会更有效,比Include参数,因为它在提供商等级进行滤波已经,如cmdlet description讨论:

筛选器比其他参数更有效,因为提供 检索对象的时候,而不是拥有Windows 他们被检索后PowerShell的过滤器的对象适用于他们。

here

...筛选参数产生早,过滤, 而-包括后来的早期筛选!两种方法之间的性能差异 事实证明是显着的!

它是一个记录的行为/错误?我在the post mentioned before中也找到类似的东西,但在官方文档中找不到。

回答

1

根据链接的问题,这看起来像-Filter参数的限制。我想另一个解决办法是仍然使用-Filter其性能优势,但随后过滤掉多余的结果,你不Where-Object事后想:

Get-ChildItem -filter "*.inf" | where {$_ -match "\.inf$"} 

它使用正则表达式$字符返回只有在.inf是字符串的结尾。