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


Answers

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

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

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

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

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

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

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




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

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




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

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



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

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