我必须在给定目录(文件夹和子文件夹)中搜索与模式匹配的文件(文件名)。
我想要符合以下条件的文件名称列表(显示给用户)
- 文件扩展名应为 .txt
- 最后一个 .(句点)之前的字符不是数字。
例如:如果目录包含以下文件,
示例 1.11.0.3.2-beta.txt
示例 2.11.0.3.txt
示例 3.11.0.3.3-gamm.txt
示例 1.11.0.4.txt
我希望向用户显示第一个和第三个文件名(因为它不包含最后一个文件名之前的数字)。
答案1
这电源外壳文档指出,只要有可能,最好使用-Filter
参数(如果可用)的提供程序(在本例中为 FIleSystem 提供程序),因为它比参数中的通配符或使用 '参数或管道进行的-Path
后续过滤更有效。include/-exclude
Where-Object
因为电源外壳的通配符实现除了更熟悉的*
和之外还添加了字符集/范围?
,我最初认为 OP 所需的选择可以完全包含在参数中-Filter
:
(gci -Path .\ -Filter *[a-zA-Z].txt -Recurse).FullName
但这没有产生任何结果,因为 FIleSystem 提供程序无法识别范围规范。因此,虽然该-Filtter
参数可以满足*.txt
要求,但Where-Object
仍然需要排除以数字结尾的 BaseNames:
(gci -Filter *.txt -Recurse | ? BaseName -match '\D$').FullName
答案2
您可以使用Get-ChildItem
match 语句递归地使用。
例子:
Get-ChildItem "d:\temp" -recurse | where {$_.name -match "[a-zA-Z].txt"} | select name
如果您的文件夹结构是:
\Temp\alpha.txt
\Temp\alpha44.txt
\Temp\Folder1\beta.txt
\Temp\Folder1\beta22.txt
\Temp\Folder2\gamma.txt
\Temp\Folder2\77gamma.txt
该查询将返回:
alpha.txt
beta.txt
gamma.txt
77gamma.txt
如果您愿意,可以select fullname
显示完整的文件路径而不是仅显示文件名。
编辑以解决评论中的问题:
Get-ChildItem "C:\temp" -recurse | Where-Object {$_.name -match "[a-zA-Z].nupkg"} | foreach-object {write-host $_.FullName}
这将写出不包含数组附加字符的文件路径。