Как найти строку в нескольких файлах и вернуть имена файлов в Powershell? - PullRequest
265 голосов
/ 16 ноября 2011

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

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

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

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

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

Ответы [ 10 ]

407 голосов
/ 16 ноября 2011

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

Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
67 голосов
/ 23 февраля 2014

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

Пункт (2) - более краткая форма ответов от Jon Z и manojlds, тогда как пункт (1) эквивалентен ответам от vikas368 и buygrush.

  1. Список FileInfo объекты для всех файлов, содержащих шаблон:

    <b>Get-ChildItem -Recurse</b> <i>filespec</i> <b>| Where-Object { Select-String</b> <i>pattern</i> <b>$_ -Quiet }</b>
    <b>ls -r</b> <i>filespec</i> <b>| ? { sls</b> <i>pattern</i> <b>$_ -q }</b>
    
  2. Список имена файлов для всех файлов, содержащих шаблон:

    <b>Get-ChildItem -Recurse</b> <i>filespec</i> <b>| Select-String</b> <i>pattern</i> <b>| Select-Object -Unique Path</b>
    <b>ls -r</b> <i>filespec</i> <b>| sls</b> <i>pattern</i> <b>| select -u Path</b>
    
  3. Список FileInfo объекты для всех файлов не содержащие шаблон:

    <b>Get-ChildItem -Recurse</b> <i>filespec</i> <b>| Where-Object { !(Select-String</b> <i>pattern</i> <b>$_ -Quiet) }</b>
    <b>ls -r</b> <i>filespec</i> <b>| ? { !(sls</b> <i>pattern</i> <b>$_ -q) }</b>
    
  4. Список имена файлов для всех файлов не , содержащий шаблон:

    <b>(Get-ChildItem -Recurse</b> <i>filespec</i> <b>| Where-Object { !(Select-String</b> <i>pattern</i> <b>$_ -Quiet) }).FullName</b>
    <b>(ls -r</b> <i>filespec</i> <b>| ? { !(sls</b> <i>pattern</i> <b>$_ -q) }).FullName</b>
    
14 голосов
/ 16 ноября 2011

Передайте содержимое вашего

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
13 голосов
/ 11 июня 2015

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

Get-ChildItem -Path d:\applications\*config -recurse |  Select-String -Pattern "dummy" 
9 голосов
/ 22 ноября 2011
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}

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

7 голосов
/ 05 июня 2017

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

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

или

ls -r | Select-String dummy | fl *

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

5 голосов
/ 05 февраля 2017

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

select-string -Path "c:\temp\*.*" -Pattern "result"  -List | select Path
5 голосов
/ 21 февраля 2014

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

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

или коротко:

ls -r | ?{ $_ | Select-String -Pattern "dummy" }
3 голосов
/ 07 декабря 2014

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

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

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

2 голосов
/ 28 марта 2019

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

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"

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

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