我有一个同时包含.xls、.xlsx和.xlsm文件的文件夹,并且希望只筛选.xls文件。
为什么下面这行代码不能像我预期的那样工作?我看到了.xls、.xlsx和.xlsm结果。
Get-ChildItem $(Get-Location) -Filter *.xls | ForEach-Object { $_.Extension }
我有一个同时包含.xls、.xlsx和.xlsm文件的文件夹,并且希望只筛选.xls文件。
为什么下面这行代码不能像我预期的那样工作?我看到了.xls、.xlsx和.xlsm结果。
Get-ChildItem $(Get-Location) -Filter *.xls | ForEach-Object { $_.Extension }
2条答案
按热度按时间qhhrdooz1#
-Filter
参数的通配符匹配*不是由PowerShell执行的,它将传递给文件系统提供程序并最终传递给Windows API。在那里执行的匹配有许多遗留行为和怪癖,包括您看到的:-Filter *.xls
的行为类似于-Filter *.xls*
。因此,-Filter *.xls
同时匹配foo.xls
和foo.xlsx
;发生这种情况是因为8.3(短)文件名也在幕后匹配;例如,foo.xlsx
的8.3文件名类似于FOO~1.XLS
;请注意.xlsx
到.XLS
的截断(和大写)。about_Wildcards
)通过[...]
(例如,[a-z]
)支持字符范围/集--Filter
不支持它们。-Filter
参数总体上仍然比使用-Path
/-Include
(见下文)更可取因为其卓越的性能**(过滤发生在源头,而不是PowerShell中的事后过滤)。解决方法是使用
-Path
参数,以便使用PowerShell的通配符匹配:注意:使用
-Recurse
时,您将使用-Include
参数。[1]其他值得注意的怪癖:
?
通配符可以匹配更少个字符的名称。Get-ChildItem -Filter ??.txt
匹配aa.txt
,意外也匹配a.txt
*.
匹配无扩展名的文件名和目录名。Get-ChildItem -File -Filter *.
查找其名称没有扩展名(例如,file
)的所有文件(-File
);这种怪癖实际上可能很有用,因为它是查找无扩展名文件的最简单和最佳性能的方法(-Path *.
不起作用,因为它查找字面上以.
结尾的文件名)。*.*
还包括无扩展名的文件名和目录名。背景故事和血腥细节见this excellent answer by Zenexer。
gtlvzcf82#
-筛选器与文件名的简短版本匹配。这已经在其他地方得到了报道。这一问题在PowerShell 6中得到了解决。