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


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

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

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

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

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

9 215

9 ответов:

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

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

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

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

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

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

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

или короче:

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

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

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

или

ls -r | Select-String dummy | fl

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

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

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

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

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

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