如何在多个文件中搜索字符串并在Powershell中返回文件名?


303

几天前,我已经开始学习Powershell,但在Google上找不到我需要的任何东西,因此请耐心等待。

我被要求将一些文本字符串替换为多个文件。我不一定知道可能目标文件的扩展名,也不知道它们的位置。到目前为止,我已经设法递归浏览到目录(get-ChildItem -recurse),并使用get-content和select-string找到了我正在寻找的字符串:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

问题是,我可以看到要查找的文本的出现,但是我不知道如何告诉PS返回每个匹配文件的路径和名称。

如何获取包含要查找的表达式的文件的名称和位置?


2
也许将问题编辑得更通用。这个问题的答案与JBoss或您正在开发的应用程序无关……
Kolob Canyon

5
2年后,我才发现您的评论并编辑了我的问题!迟到总比没有好。.:)
Bluz

Answers:


468

这应该给出包含您的模式的文件的位置:

Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path

3
如果您还想移动这些文件怎么办?...我在无法加入|的情况下遇到错误。将项目移到末尾。
rud3y 2012年

6
Move-Item没有name参数。尝试添加| %{Move-Item $_.name <destination>}
jon Z 2012年

49
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path仅返回每个文件的第一个匹配项,因此效率可能更高一些,并且无需对它们进行分组
Ben

5
这是值得注意的是,你可以过滤只有在一定的文件类型,比如txt文件,如果你使用Get-ChildItem -Recurse -Filter *.txt代替
吉拉迪

@ rud3y我强烈建议您foreach在执行此类大型操作时使用循环将其写出。当您尝试在一条线上完成所有这些操作时,它变得非常令人费解,并且很容易犯大错误。我的经验之谈
科罗布峡谷

74

这里有各种各样的准确答案,但这是几种不同变体的最简洁的代码。对于每个变体,顶行显示完整语法,底端显示简洁语法。

第(2)项是Jon Z和manojlds回答的一种更为简洁的形式,而第(1)项等同于vikas368和buygrush的回答。

  1. 列出包含模式的所有文件的FileInfo对象:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
  2. 列出所有包含模式的文件的文件名

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. 列出所有包含模式的文件的FileInfo对象:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. 列出所有包含模式的文件的文件名

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    

此外,如果你只是寻找包含模式的任何位置的文件,你可以通过使用发现一审后放弃-List的参数Select-String
KyleMit

我希望OP对该问题进行了一些细微的改动,以便将其称为AA。#1非常有用,很明显@Michael Sorens抱怨PS!
cBlaine

20

这将显示路径,文件名和找到的与模式匹配的内容行。

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 

如果结果之间只能加一行:)
cladelpino

15

管道您的内容

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"

fl *

您将看到该路径已经作为对象的属性被返回。

如果只需要路径,请使用select pathselect -unique path删除重复项:

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path

1
谢谢你们俩,这正是我在寻找的东西。不幸的是,当路径中涉及许多子目录时,PS会剪切绝对路径并在该行的末尾添加三个点,例如\ dir1 \ dir2 \ dir3 \ path ...,所以我不知道返回哪个文件。有没有办法告诉PS对角色不要太贪心而烦恼出现完整路径?:) 非常感谢 !
Bluz

3
您需要将-File开关添加到其中,Get-ChildItem否则最终会因尝试调用Get-Content目录而导致错误不断出现。
RubberDuck

如果您需要完整的路径,则可以执行此操作。(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName人们似乎忘记了PowerShell是面向对象的。如有疑问,请寻找房产
Kolob Canyon

10

这就是我要做的,您不需要get-content:

ls -r | Select-String dummy | select line,path

要么

ls -r | Select-String dummy | fl *

看看有什么不同的属性...

这样更快。第二个参数是-filter:

ls -r . *.bat | select-string netsh

2
+1,这完全适合我的情况,但是select Pattern, LineNumber, Filename用于更简洁的输出。行在包含模式字符串的行上返回EVERYTHING。您也可以根据需要将其轻松输出到csv。
Protonova

9
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

这将为您提供所有文件的完整详细信息


完全不知道这-r有用。弄清楚你必须一直做-Recurse
Kolob Canyon

5

为了将完整的文件详细信息保留在结果数组中,您可以对vikas368发布的答案进行略微修改(似乎不适用于ISE自动完成功能):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }

或简而言之:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }

5

如果您搜索一个目录,则可以执行以下操作:

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path

4

这将显示每个包含搜索字符串的文件的完整路径的列表:

foreach ($file in Get-ChildItem | Select-String -pattern "dummy" | Select-Object -Unique path) {$file.path}

请注意,它不会在结果上方显示标题,也不会显示包含搜索字符串的文本行。它仅告诉您可以在哪里找到包含字符串的文件。


2
知道如何显示找到模式的行号以及文件名吗?
Piotr L

3

我修改了上面的答案之一,以给我更多的信息。以后我不用再进行第二次查询了。就像这样:

Get-ChildItem `
        -Path "C:\data\path" -Filter "Example*.dat" -recurse | `
    Select-String -pattern "dummy" | `
    Select-Object -Property Path,LineNumber,Line | `
    Export-CSV "C:\ResultFile.csv"

我可以使用这种结构指定路径和文件通配符,并将文件名,行号和相关行保存到输出文件中。


凉!感谢您提供此附加解决方案:)但是,您能否链接到您基于解决方案的答案并命名该答案的作者来表示感谢?谢谢!
Max Vollmer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.