在目录的文件夹和子文件夹中搜索文件名并获取与 powershell 中的模式匹配的文件

在目录的文件夹和子文件夹中搜索文件名并获取与 powershell 中的模式匹配的文件

我必须在给定目录(文件夹和子文件夹)中搜索与模式匹配的文件(文件名)。

我想要符合以下条件的文件名称列表(显示给用户)

  1. 文件扩展名应为 .txt
  2. 最后一个 .(句点)之前的字符不是数字。

例如:如果目录包含以下文件,

示例 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/-excludeWhere-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-ChildItemmatch 语句递归地使用。

例子:

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显示完整的文件路径而不是仅显示文件名。

此处的图像显示您的文件结构。 psquery

编辑以解决评论中的问题:

Get-ChildItem "C:\temp" -recurse | Where-Object {$_.name -match "[a-zA-Z].nupkg"} | foreach-object {write-host $_.FullName}

这将写出不包含数组附加字符的文件路径。

相关内容