Как найти строку в нескольких файлах и вернуть имена файлов в Powershell?

Я начал изучать PowerShell пару дней назад, и я не смог найти в Google ничего, что могло бы сделать то, что мне нужно, поэтому, пожалуйста, ответьте на мой вопрос.

Меня попросили заменить некоторые текстовые строки на несколько файлов. Я не обязательно знаю расширение возможных целевых файлов и не знаю, где они находятся. До сих пор мне удалось рекурсивно просмотреть каталог (get-ChildItem -recurse) и найдите искомую строку с помощью get-content и select-string:

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

Проблема в том, что я могу видеть вхождения искомого текста, но я не знаю, как сказать PS возвращать путь и имя для каждого соответствующего файла.

Как я могу получить имя и расположение файлов, которые содержат искомое выражение?

12 ответов

Решение

Это должно дать расположение файлов, которые содержат ваш шаблон:

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

Здесь есть множество точных ответов, но здесь приведен наиболее краткий код для нескольких различных вариантов. Для каждого варианта в верхней строке показан полный синтаксис, а в нижней - краткий синтаксис.

Пункт (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
    

Вот как я бы это сделал, вам не нужен get-контент:

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

или же

ls -r | Select-String dummy | fl *

Чтобы увидеть, что различные свойства...

Это отобразит путь, имя файла и найденную им строку содержимого, которые соответствуют шаблону.

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

Труба содержание вашего

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

в fl *

Вы увидите, что путь уже возвращается как свойство объектов.

Если вы хотите просто путь, используйте select path или же select -unique path удалить дубликаты:

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

Я изменил один из ответов выше, чтобы дать мне немного больше информации. Это избавило меня от второго запроса позже. Это было что-то вроде этого:

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"

Я могу указать путь и подстановочные знаки файла с этими структурами, и это сохраняет имя файла, номер строки и соответствующую строку в выходной файл.

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

Это даст вам полную информацию обо всех файлах

В PowerShell перейдите по пути, по которому находятся ваши файлы, затем введите эту команду и замените ENTER THE STRING YOU SEARCH HERE (но сохраните двойные кавычки):

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

Хорошего дня

Чтобы сохранить полную информацию о файле в результирующем массиве, вы можете использовать небольшую модификацию ответа, опубликованного vikas368 (который, похоже, плохо работает с автозаполнением ISE):

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

или короче говоря:

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

Если вы ищете в одном каталоге, вы можете сделать это:

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

Это отобразит список полного пути к каждому файлу, который содержит строку поиска:

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

Обратите внимание, что он не отображает заголовок над результатами и не отображает строки текста, содержащие строку поиска. Все, что он говорит вам, это где вы можете найти файлы, которые содержат строку.

Этот скрипт работал, чтобы найти конкретный файл в 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 
Другие вопросы по тегам