Как искать строку в нескольких файлах и возвращать имена файлов в Powershell?
Я начал изучать powershell пару дней назад, и я не мог найти ничего в google, что делает то, что мне нужно, поэтому, пожалуйста, ответьте на мой вопрос.
меня попросили заменить некоторые текстовые строки в несколько файлов. Я не обязательно знаю расширение возможных целевых файлов, и я также не знаю их местоположение. До сих пор мне удалось рекурсивно просматривать каталог (get-ChildItem -recurse
) и найти строку, которую я искал с get-content и select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
проблема в том, что я вижу вхождения текста, который я ищу, но я не знаю, как сказать PS, чтобы вернуть путь и имя для каждого соответствующего файла.
Как я могу получить имя и расположение файлов, содержащих выражение, которое я ищу?
9 ответов:
Это должно дать расположение файлов, которые содержат ваш шаблон:
Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
здесь есть множество точных ответов, но вот самый краткий код для нескольких различных вариантов. Для каждого варианта верхняя строка показывает полный синтаксис, а нижняя-краткий синтаксис.
пункт (2) является более краткой формой ответов от Jon Z и manojlds, в то время как пункт (1) эквивалентен ответам от vikas368 и buygrush.
список FileInfo предметы для всех файлов, содержащих выкройка:
Get-ChildItem -Recurse filespec | Where-Object { Select-String pattern $_ -Quiet } ls -r filespec | ? { sls pattern $_ -q }
список имена файлов для всех файлов, содержащих шаблон:
Get-ChildItem -Recurse filespec | Select-String pattern | Select-Object -Unique Path ls -r filespec | sls pattern | select -u Path
список FileInfo предметы для всех файлов не содержащий шаблон:
Get-ChildItem -Recurse filespec | Where-Object { !(Select-String pattern $_ -Quiet) } ls -r filespec | ? { !(sls pattern $_ -q) }
список имена файлов для всех файлов не содержащий шаблон:
(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}
обратите внимание, что он не отображает заголовок над результатами и не отображаются строки текста, содержащие строку поиска. Все это говорит вам, где вы можете найти файлы, содержащие строку.