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

String 如何在多个文件中搜索字符串并在Powershell中返回文件名?,string,search,text,powershell,recursion,String,Search,Text,Powershell,Recursion,几天前我开始学习powershell,但我在google上找不到任何符合我需要的东西,所以请接受我的问题 我被要求将一些文本字符串替换为多个文件。我不一定知道可能的目标文件的扩展名,也不知道它们的位置。到目前为止,我已设法递归浏览目录(get ChildItem-recurse),并使用get content和select string查找字符串: Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" 问题是

几天前我开始学习powershell,但我在google上找不到任何符合我需要的东西,所以请接受我的问题

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

Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
问题是,我可以看到我要查找的文本的出现,但我不知道如何告诉PS返回每个匹配文件的路径和名称


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

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

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

通过管道传输您的内容

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

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

如果只需要路径,请使用
选择路径
选择-唯一路径
删除重复项:

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

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

为了将完整的文件详细信息保存在生成的数组中,您可以对vikas368发布的答案稍加修改(该答案似乎与ISE自动完成不兼容):

简言之:

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

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

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

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

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
    Get ChildItem-Recurse filespec | Where Object{Select String pattern$|-Quiet}
    ls-r文件规范|?{sls模式$q}
    
  • 列出包含以下图案的所有文件的文件名:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
    Get ChildItem-递归文件规范|选择字符串模式|选择对象-唯一路径
    ls-r filespec | sls模式|选择-u路径
    
  • 列出所有文件的FileInfo对象不包含模式:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
    Get ChildItem-Recurse filespec | Where Object{!(选择字符串模式$\安静)}
    ls-r文件规范|?{!(sls模式$q)}
    
  • 列出所有文件的文件名,这些文件不包含模式:

    Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet }
    ls -r filespec | ? { sls pattern $_ -q }
    
    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -q) }).FullName
    
    (Get ChildItem-Recurse filespec | Where Object{!(选择字符串模式$|-Quiet)})
    (ls-r filespec |?{!(sls模式$|-q)}).FullName
    

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

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

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

    这将显示路径、文件名以及找到的与模式匹配的内容行

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

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

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

    我会这样做,您不需要获取内容:

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

    要查看不同的属性是什么

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

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

    我修改了上面的一个答案,以提供更多信息。这就省去了我以后的第二个问题。是这样的:

    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"
    

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

    使用PowerShell,转到文件所在的路径,然后键入此命令并替换
    在此处输入搜索的字符串(但保留双引号):


    祝你们今天愉快,谢谢你们,这正是我想要的。不幸的是,当路径中涉及多个子目录时,PS将剪切绝对路径,并在行的末尾添加三个点,如\dir1\dir2\dir3\path。。。所以我不知道返回了哪个文件。有没有一种方法可以告诉PS不要太贪心字符,也不要麻烦显示完整的路径谢谢!您需要将
    -File
    开关添加到
    Get ChildItem
    ,否则,您在试图调用目录上的
    Get Content
    时会遇到一系列无休止的错误。如果需要完整路径,您可以执行此操作
    (Get ChildItem-递归| Get Content |选择字符串-模式“dummy”).FullName
    人们似乎忘记了PowerShell是面向对象的;如果有疑问,请查找属性What如果您还想移动这些文件?。。。我遇到一个错误,无法将一个| Move-Item连接到该项目的末尾。Move-Item没有
    name
    参数。尝试添加
    |%{Move Item$uuz.name}
    Get ChildItem-Recurse | Select String“dummy”-List | Select Path
    只返回每个文件的第一个匹配项,因此可能会更有效一些,并且避免了对它们进行分组的需要。值得注意的是,您可以只筛选特定的文件类型,例如
    txt
    文件,如果使用
    getchilditem-Recurse-Filter*.txt
    instead@rud3y我强烈建议您使用
    foreach
    循环在脚本中编写它,如果您正在执行类似的大型操作。当你试图在一条线上做所有这些事情时,它变得非常复杂,很容易犯一个大错误。我从经验中说同样,如果你只是在任何地方寻找包含模式的文件,你可以在找到第一个实例后放弃,方法是使用的
    -List
    参数,我希望OP对这个问题稍加修改,这样这就是AA#1是非常有用的,很明显,@MichaelSorens是个笨蛋!知道如何显示找到图案的行号吗