powershell 在Get-ChildItem中指定*.xls筛选器也会返回*.xlsx结果

vyswwuz2  于 2022-11-10  发布在  Shell
关注(0)|答案(2)|浏览(249)

我有一个同时包含.xls、.xlsx和.xlsm文件的文件夹,并且希望只筛选.xls文件。
为什么下面这行代码不能像我预期的那样工作?我看到了.xls、.xlsx和.xlsm结果。

Get-ChildItem $(Get-Location) -Filter *.xls | ForEach-Object { $_.Extension }
qhhrdooz

qhhrdooz1#

-Filter参数的通配符匹配*不是由PowerShell执行的,它将传递给文件系统提供程序并最终传递给Windows API。在那里执行的匹配有许多遗留行为和怪癖,包括您看到的:

  • Windows PowerShell中,-Filter *.xls的行为类似于-Filter *.xls*。因此,-Filter *.xls同时匹配foo.xlsfoo.xlsx;发生这种情况是因为8.3(短)文件名在幕后匹配;例如,foo.xlsx的8.3文件名类似于FOO~1.XLS;请注意.xlsx.XLS的截断(和大写)。
  • 虽然**短名称匹配行为在PowerShell[Core]V6+**中不再出现,但幸运的是,其他遗留问题仍然存在[1],最显著的差异(不会消失)也是如此:只有PowerShell通配符表达式(请参阅about_Wildcards)通过[...](例如,[a-z])支持字符范围/集--Filter不支持它们。
  • 使用-Filter参数总体上仍然比使用-Path/-Include(见下文)更可取因为其卓越的性能**(过滤发生在源头,而不是PowerShell中的事后过滤)。
    解决方法是使用-Path参数,以便使用PowerShell的通配符匹配:
Get-ChildItem -Path (Join-Path (Get-Location) *.xls) | ForEach-Object { $_.Extension }

# Or, more simply

Get-ChildItem -Path $PWD/*.xls | ForEach-Object Extension

注意:使用-Recurse时,您将使用-Include参数

[1]其他值得注意的怪癖:

  • 多个连续的?通配符可以匹配更少个字符的名称。
  • 例如,Get-ChildItem -Filter ??.txt匹配aa.txt,意外也匹配a.txt
  • 模式*.匹配无扩展名的文件名和目录名。
  • 例如,Get-ChildItem -File -Filter *.查找其名称没有扩展名(例如,file)的所有文件(-File);这种怪癖实际上可能很有用,因为它是查找无扩展名文件的最简单和最佳性能的方法(-Path *.不起作用,因为它查找字面上.结尾的文件名)。
  • 注意:这在PowerShell Core 6.x(从6.2.3起)中已被临时更改,但该行为在PowerShell Core 7.0中又回来了。
  • 相反,*.*还包括无扩展名的文件名和目录名。

背景故事和血腥细节见this excellent answer by Zenexer

gtlvzcf8

gtlvzcf82#

-筛选器与文件名的简短版本匹配。这已经在其他地方得到了报道。这一问题在PowerShell 6中得到了解决。

echo hi > file.xlsx
dir -filter *.xls

    Directory: C:\users\js\foo

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        2/11/2020   9:54 AM              4 file.xlsx

cmd /c dir /x

 Volume in drive C is DISK
 Volume Serial Number is A11A-AA11

 Directory of C:\users\js\foo

02/11/2020  09:54 AM    <DIR>                       .
02/11/2020  09:54 AM    <DIR>                       ..
02/11/2020  09:54 AM                 4 FILE~1.XLS   file.xlsx
               1 File(s)              4 bytes
               2 Dir(s)   3,380,170,752 bytes free

相关问题