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

我几天前开始学习powershell,我在谷歌上找不到任何我需要的东西,所以请忍受我的问题。

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

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

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

如何获得包含我正在寻找的表达式的文件的名称和位置?

555098 次浏览

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

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

管道的内容

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
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

这将为您提供所有文件的完整细节

为了在结果数组中保持完整的文件细节,你可以使用vikas368发布的答案进行轻微修改(这似乎与ISE自动完成不太好):

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

简而言之:

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

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

第(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. List file names for all files containing pattern:

    Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path
    ls -r filespec | sls pattern | select -u Path
    
  3. List FileInfo objects for all files not containing pattern:

    Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }
    ls -r filespec | ? { !(sls pattern $_ -q) }
    
  4. List file names for all files not containing pattern:

    (Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) }).FullName
    (ls -r filespec | ? { !(sls pattern $_ -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

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

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

ls -r | Select-String dummy | fl *

看看不同的属性是什么…

这是。第二个参数是-filter:

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


ls -r -path . -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,进入文件所在的路径,然后输入这个命令并替换ENTER THE STRING YOU SEARCH HERE(但保持双引号):

findstr /S /I /M /C:"ENTER THE STRING YOU SEARCH HERE" *.*

有一个美好的一天🙂

这个脚本可以在3 000 000文件中找到一个特定的文件

Param
(


#Define o parametro do ano a eliminar "2020"
$DateDel = '2019',
     

#Define o parametro do registro do ficheiro "_800" ou "_800sm" ou "_200"
$ResFile1 = '_200',
$ResFile2 = '_800',
$ResFile3 = '_800sm',


#Define o parametro da terminacao do ficheiro "_800.jpg" ou "_800sm.jpg" ou "_200.jpg"
$TypeFile = '.jpg',
     

#Define o parametro de onde se localizado ficheiro "C:\users\Luis.Cunha\Desktop\LuisCunha\TarefaScript\TesteFinal\TesteScript1"
$HomePath = 'C:\Users\Luis.Cunha\Desktop\LuisCunha\TarefaScript'
)


 #Inicia transcriçao de toda informação para o ficheiro .log indicado
Start-Transcript -Path $HomePath\CountDelItems.log -NoClobber -Append


Get-ChildItem $HomePath -Recurse -File | Measure-Object | %{$_.Count}


#o Get vai buscar o ficheiro com a data e a terminacao definidas no $homepath e $tipofich atraves do caminho indicado no $path
#depois confirma os valores que foram removidos com o verbose
Get-Childitem -Path $HomePath -Recurse -force | Where-Object { !$_.PSIsContainer -and $_.name -like "????$DateDel*$ResFile1$TypeFile" } | Measure-Object | %{$_.Count}
    

#Get-Childitem -Path $HomePath -Recurse -force | Where-Object { !$_.PSIsContainer -and $_.name -like "????$DateDel*$ResFile1$TypeFile" } | Remove-Item -Verbose -Force


Get-ChildItem $HomePath -Recurse -File | Measure-Object | %{$_.Count}




#Termina transcrição
Stop-Transcript