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

Blu*_*luz 279 string powershell recursion search text

我几天前已经开始学习powershell了,我在google上找不到任何我需要的东西,所以请忍受我的问题.

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

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Run Code Online (Sandbox Code Playgroud)

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

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

jon*_*n Z 433

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

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
Run Code Online (Sandbox Code Playgroud)

  • `Get-ChildItem -Recurse | Select-String"dummy"-List | Select Path`仅返回每个文件的第一个匹配项,因此可能更有效,并且无需对它们进行分组 (45认同)
  • Move-Item没有`name`参数.尝试添加`| %{Move-Item $ _.name <destination>}` (6认同)
  • 值得注意的是,如果您改用`Get-ChildItem -Recurse -Filter * .txt`,则只能过滤某些文件类型,例如`txt`文件。 (4认同)
  • 如果你想移动那些文件怎么办?...我收到一个错误,我无法加入| 将项目移动到结尾. (3认同)
  • @rud3y 如果您正在进行类似的大型操作,我强烈建议您使用“foreach”循环将其写在脚本中。当您尝试在一行中完成所有这些操作时,它会变得非常复杂,并且很容易犯一个大错误。我凭经验说话 (2认同)
  • 如果输出的路径被裁剪(如果找到的路径很长,可能会发生这种情况),只需添加`| 上述命令末尾的 Format-Table -AutoSize` (2认同)

Mic*_*ens 70

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

项目(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 }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 列出包含模式的所有文件的文件名:

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

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

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

  • 我希望 OP 能稍微改变一下问题,这样就可以成为 AA。#1 非常有用,很明显@Michael Sorens 很高兴 PS! (2认同)

man*_*lds 14

管道你的内容

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Run Code Online (Sandbox Code Playgroud)

fl *

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

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

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
Run Code Online (Sandbox Code Playgroud)

  • 您需要将`-File`开关添加到`Get-ChildItem`,否则您最终会在尝试在目录上调用`Get-Content`时出现永无止境的错误级联. (3认同)
  • 感谢你们俩,这正是我正在寻找的。不幸的是,当路径中涉及很多子目录时,PS会剪切绝对路径并在行尾添加三个点,如\dir1\dir2\dir3\path...所以我不知道返回哪个文件。有没有办法告诉 PS 不要那么贪婪地显示完整路径?:) 多谢 ! (2认同)

小智 14

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

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
Run Code Online (Sandbox Code Playgroud)


vik*_*368 9

Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
Run Code Online (Sandbox Code Playgroud)

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


js2*_*010 9

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

ls -r | Select-String dummy | select line,path
Run Code Online (Sandbox Code Playgroud)

要么

ls -r | Select-String dummy | fl *
Run Code Online (Sandbox Code Playgroud)

要了解不同的属性是什么......

  • 这应该是选定的答案。在我的例子中,速度大约快了 4-5 倍。当您必须对许多文件重复该命令 600 次时,这会产生很大的差异。 (3认同)
  • +1,这适用于我的情况,但是使用`select Pattern,LineNumber,Filename`可以获得更简洁的输出.Line在包含您的模式字符串的行上返回EVERYTHING.如果您愿意,也可以轻松将其输出到csv. (2认同)

Jul*_*ada 9

使用 PowerShell,转到文件所在的路径,然后键入以下命令并替换ENTER THE STRING YOU SEARCH HERE(但保留双引号):

findstr /S /I /M /C:"ENTER THE STRING YOU SEARCH HERE" *.*
Run Code Online (Sandbox Code Playgroud)

祝你今天过得愉快


buy*_*ush 5

要在结果数组中保留完整的文件详细信息,您可以稍微修改vikas368发布的答案(这似乎不适用于ISE自动完成):

Get-ChildItem -Recurse | Where-Object { $_ | Select-String -Pattern "dummy" }
Run Code Online (Sandbox Code Playgroud)

或简而言之:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
Run Code Online (Sandbox Code Playgroud)


Esp*_*o57 5

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

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
Run Code Online (Sandbox Code Playgroud)


小智 5

我修改了上面的答案之一,以提供更多信息。这让我稍后再进行第二次查询。它是这样的:

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"
Run Code Online (Sandbox Code Playgroud)

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