Powershell 列出与模式匹配的文件夹中的文件名,不包括文件内容

Powershell 列出与模式匹配的文件夹中的文件名,不包括文件内容,powershell,powershell-5.0,Powershell,Powershell 5.0,我使用下面的命令递归列出包含$pattern Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name 但它似乎同时列出了名称和内容中都包含$pattern的文件,例如,当我运行上面的$pattern=“SAMPLE”时,我得到: C:\tmp\config.include C:\tmp\README.md C:\tmp\specs\SAMPLE.data.n

我使用下面的命令递归列出包含
$pattern

Get-ChildItem $targetDir -recurse | Select-String -pattern "$pattern" | group path | select name
但它似乎同时列出了名称和内容中都包含
$pattern
的文件,例如,当我运行上面的
$pattern=“SAMPLE”
时,我得到:

C:\tmp\config.include
C:\tmp\README.md
C:\tmp\specs\SAMPLE.data.nuspec
C:\tmp\specs\SAMPLE.Connection.nuspec
现在:

确实包含示例关键字/文本,但我不关心这一点,我只需要命令列出文件名,而不需要列出内容与模式匹配的文件。我错过了什么

基于以下答案,我也尝试过:

$targetDir="C:\tmp\"
Get-ChildItem $targetDir -recurse | where {$_.name -like "SAMPLE"} | group path | select name
以及:

但它不会返回任何结果。

正在按照您的要求执行。我的

get-ChildItem $targetDir -recurse | where {$_.name -like $pattern} | select name
Select String cmdlet在输入字符串和文件中搜索文本和文本模式

因此,如果您只是想与文件名匹配,只需使用
Get ChildItem
-Filter
,或使用
Where Object
进行后期处理即可

Get-ChildItem -Path $path -Recurse -Filter "*sample*"
这将返回名称中包含sample的所有文件和文件夹。如果您只需要文件或目录,则可以使用开关
-File
-Directory
返回这些特定的对象类型

如果您的模式比一个简单的单词更复杂,那么您可能需要使用
Where Object
like in和
-match
之类的东西来访问regex


代码中的分组逻辑应该是冗余的,因为您返回的是具有唯一路径的单个文件。因此,我没有把它包括在这里。如果只需要路径,则可以通过管道进入
选择对象-展开全名
(Get-ChildItem-Path$Path-Recurse-Filter“*sample*”)。全名
以补充:

具体地说,因为您要传送到
选择字符串的
[System.IO.FileInfo]
对象
,这是
获取子项
的输出-而不是字符串,所以搜索这些对象所代表的文件的内容

假设您只需要匹配每个文件路径的文件名部分,并且您的模式可以表示为通配符表达式,那么您根本不需要
Select String
,而是可以使用
Get ChildItem
-Filter
,如Matt的答案所示,或者更慢,但功能稍强的
-包括

警告:

  • 选择字符串-模式
    接受正则表达式(例如,
    *sample.
    ;请参阅
    获取有关正则表达式的帮助

  • Get ChildItem-Filter/-Include
    接受通配符表达式(例如,
    *sample*
    ;请参阅
    Get Help about_Wildcards
    ),它们是不同的东西

另请注意:如果您的目的是仅匹配文件,则可以使用
-File
(类似地,您可以将输出限制为带有
-Directory
的目录)告诉
Get ChildItem
,以将输出限制为文件(而可能也是目录)


组对象路径
组路径
)将无法按预期工作,因为由
选择字符串
输出的匹配信息对象的
.path
属性包含完整的文件名,因此您会将每个文件放在其自己的组中—基本上是禁止操作的

仅使用
Get ChildItem
时,等效的属性名将是
.FullName
,但您要查找的是按父路径(包含目录的路径)进行分组,
.DirectoryName
),我想,因此:

... | Group-Object DirectoryName | Select-Object Name
这将输出每个目录的完整路径,其中至少包含一个具有匹配文件名的文件。

(请注意,
选择对象名称
中的
名称
是指由
组对象
返回的组对象的
名称
属性,在本例中,该属性是输入对象的
目录名称
属性的值。)

您可以直接使用“选择字符串”来搜索与特定字符串匹配的文件,是的,这将返回文件名:count:content。。。等等,但是,在内部,这些名称您可以选择或省略,您需要的是“文件名”来执行此操作,将其导入“选择对象”,从输出中选择“文件名”

因此,要选择所有具有“Subject:Webservices restarted”模式的*.MSG文件,您可以执行以下操作:

选择String-Path.*.MSG-Pattern'Subject:WebServices Restarted' -列表|选择对象文件名

此外,要动态删除这些文件,可以使用RM命令插入ForEach语句,如下所示:

选择String-Path.*.MSG-Pattern'Subject:WebServices Restarted' -列表|选择对象文件名| foreach{rm$ux.Filename}

我自己也试过,效果100%


我希望这能有所帮助

我通过@Itchydon找到了答案

但无法遵循'-like'$模式的使用

我试图列出文件名中包含32个字符(字母和数字)的文件

PS C:>
Get ChildItem C:\Users \-Recurse |其中{$\名称-匹配“[a-zA-Z0-9]{32}”}|选择名称

PS C:>
Get ChildItem C:\Users\010M\Documents\WindowsPowerShell-Recurse |其中对象{$\名称-匹配“[A-Z0-9]{32}”}|选择名称


因此,在本例中,无论您是使用where还是where object

我没有正确阅读标题,而您却阅读了。我想在这里说明为什么您的代码是正确的解决方案。在某些情况下,仅仅粘贴没有上下文的代码并没有多大帮助<代码>选择字符串
正在搜索文件内容。。根据模式的性质,您可能还可以使用
Get ChildItem
-Filter
,并跳过
的Where
。这里的
应该是r
Get-ChildItem -Path $path -Recurse -Filter "*sample*"
... | Group-Object DirectoryName | Select-Object Name