Ответ 1
Это должно указывать расположение файлов, содержащих ваш шаблон:
Get-ChildItem -recurse | Select-String -pattern "dummy" | group path | select name
Я начал изучать PowerShell пару дней назад, и я не смог найти в Google ничего, что могло бы сделать то, что мне нужно, поэтому, пожалуйста, ответьте на мой вопрос.
Меня попросили заменить некоторые текстовые строки на несколько файлов. Я не обязательно знаю расширение возможных целевых файлов и не знаю, где они находятся. До сих пор мне удалось рекурсивно просмотреть каталог (get-ChildItem -recurse
) и найти get-ChildItem -recurse
строку с помощью get-content и select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Проблема в том, что я могу видеть вхождения искомого текста, но я не знаю, как сказать PS возвращать путь и имя для каждого соответствующего файла.
Как я могу получить имя и расположение файлов, которые содержат искомое выражение?
Это должно указывать расположение файлов, содержащих ваш шаблон:
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"
to fl *
Вы увидите, что путь уже возвращается как свойство объектов.
ЕСЛИ вы хотите только путь, используйте select path
или select -unique path
для удаления дубликатов:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy" | select -unique path
Отобразится путь, имя файла и найденная строка содержимого, которые соответствуют шаблону.
Get-ChildItem -Path d:\applications\*config -recurse | Select-String -Pattern "dummy"
Get-ChildItem -r | ? {$_.psiscontainer -eq $false} | ? {gc $_.pspath |select-string -pattern "dummy"}
Это даст вам полную информацию обо всех файлах
Вот как я бы это сделал, вам не нужен get-контент:
ls -r | Select-String dummy | select line,path
или же
ls -r | Select-String dummy | fl *
Чтобы увидеть, что различные свойства...
Чтобы сохранить полную информацию о файле в результирующем массиве, вы можете использовать небольшую модификацию ответа, отправленного 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}
Обратите внимание, что он не отображает заголовок над результатами и не отображает строки текста, содержащие строку поиска. Все это говорит вам, где вы можете найти файлы, содержащие строку.
Я изменил один из ответов выше, чтобы дать мне немного больше информации. Это избавило меня от второго запроса позже. Это было что-то вроде этого:
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"
Я могу указать путь и подстановочные знаки файла с этими структурами, и это сохраняет имя файла, номер строки и соответствующую строку в выходной файл.