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

时间:2011-11-16 15:00:29

标签: string search text powershell recursion

我几天前已经开始学习powershell了,我在google上找不到任何我需要的东西,所以请耐心等待我的问题。

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

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

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

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

11 个答案:

答案 0 :(得分:398)

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

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name

答案 1 :(得分:64)

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

项目(2)是Jon Z和manojlds的答案的更简洁形式,而项目(1)相当于vikas368和buygrush的答案。

  1. 列出包含pattern的所有文件的 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
    

答案 2 :(得分:14)

管道

的内容
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

答案 3 :(得分:12)

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

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

答案 4 :(得分:9)

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

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

答案 5 :(得分:6)

我就是这样做的,你不需要获取内容:

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

ls -r | Select-String dummy | fl *

要了解不同的属性......

答案 6 :(得分:5)

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

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

或简称:

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

答案 7 :(得分:4)

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

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

答案 8 :(得分:3)

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

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

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

答案 9 :(得分:1)

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

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"

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

答案 10 :(得分:1)

使用PowerShell,转到文件所在的路径,然后键入以下命令并替换import React, {useState} from 'react'; function Home(){ const initialValues = { bag: 90, donor: "", }; const [values, setValues] = useState(initialValues); console.log(values.bag) return( <div> <h1>Welcome To Home</h1> </div> );}export default Home; (但请保留双引号):

ENTER THE STRING YOU SEARCH HERE

今天过得愉快?