PowerShell Get-ChildItem过滤*.txt时匹配*.txt~的问题及解决
PowerShell 5.1中精确匹配
.txt结尾文件,排除.txt~备份文件的方法 问题原因
为什么-Filter "*.txt"会匹配.txt~文件
Get-ChildItem(别名ls)的-Filter参数使用的是Windows Shell的文件系统过滤规则,而非PowerShell原生通配符或正则表达式:
- Windows的过滤逻辑中,
*.txt会匹配所有文件名里最后一个.后以txt开头的内容,.txt~的扩展名被识别为txt~,因此会被纳入匹配结果。
为什么-Filter "*.txt$"无结果
-Filter不支持正则表达式的锚定符$,它会将$视为普通字符,系统会尝试查找文件名以.txt$结尾的文件,自然没有匹配项。
解决方法
方法1:使用-Include参数(PowerShell原生通配符)
-Include采用PowerShell自身的通配符规则,*.txt会精确匹配文件名以.txt结尾的文件:
# 当前目录下查询 Get-ChildItem .\* -Include "*.txt" # 指定路径查询 Get-ChildItem C:\so_example\* -Include "*.txt"
注意:如果不使用
\*指定路径下的所有项,-Include参数不会生效(除非搭配-Recurse)。
方法2:用Where-Object过滤
通配符匹配
Get-ChildItem | Where-Object { $_.Name -like "*.txt" }
正则表达式匹配
Get-ChildItem | Where-Object { $_.Name -match "\.txt$" }
这种方式灵活性更高,可根据需求调整匹配规则。
方法3:结合-Filter与排除规则
如果习惯用-Filter,可以先获取初步匹配结果,再排除备份文件:
Get-ChildItem -Filter "*.txt" | Where-Object { $_.Name -notlike "*~" }
内容的提问来源于stack exchange,提问作者Stassa Patsantzis
相关产品推荐
相关产品推荐

