Я начал изучать PowerShell пару дней назад, и я не смог найти в Google ничего, что могло бы сделать то, что мне нужно, поэтому, пожалуйста, ответьте на мой вопрос.
Меня попросили заменить некоторые текстовые строки на несколько файлов. Я не обязательно знаю расширение возможных целевых файлов и не знаю, где они находятся. До сих пор мне удалось рекурсивно просмотреть каталог ( get-ChildItem -recurse
) и найти искомую строку с помощью get-content и select-string:
Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy"
Проблема в том, что я вижу вхождения искомого текста, но я не знаю, как сказать PS, чтобы он возвращал путь и имя для каждого соответствующего файла.
Как я могу получить имя и расположение файлов, которые содержат искомое выражение?
Ответы:
Это должно дать расположение файлов, которые содержат ваш шаблон:
источник
name
параметра. Попробуйте добавить| %{Move-Item $_.name <destination>}
Get-ChildItem -Recurse | Select-String "dummy" -List | Select Path
возвращает только первое совпадение для каждого файла, поэтому может быть немного более эффективным и избавляет от необходимости группировать ихtxt
файлы, если вы используетеGet-ChildItem -Recurse -Filter *.txt
вместо этогоforeach
цикла, если вы делаете такие большие операции. Это становится очень запутанным, когда вы пытаетесь сделать все это в одной строке, и очень легко сделать большую ошибку. Я говорю из опытаЗдесь есть множество точных ответов, но здесь приведен наиболее краткий код для нескольких различных вариантов. Для каждого варианта в верхней строке показан полный синтаксис, а в нижней - краткий синтаксис.
Пункт (2) является более сжатой формой ответов от Jon Z и manojlds, тогда как пункт (1) эквивалентен ответам от vikas368 и buygrush.
Список объектов FileInfo для всех файлов, содержащих шаблон:
Список имен файлов для всех файлов, содержащих шаблон:
Список объектов FileInfo для всех файлов, не содержащих шаблон:
Список имен файлов для всех файлов, не содержащих шаблон:
источник
-List
параметрSelect-String
Это отобразит путь, имя файла и найденную им строку содержимого, которые соответствуют шаблону.
источник
Труба содержание вашего
в
fl *
Вы увидите, что путь уже возвращается как свойство объектов.
Если вам нужен только путь, используйте
select path
илиselect -unique path
для удаления дубликатов:источник
-File
переключательGet-ChildItem
или вы получите бесконечный каскад ошибок при попытке вызватьGet-Content
каталоги.(Get-ChildItem -recurse | Get-Content | Select-String -pattern "dummy").FullName
Люди, кажется, забывают, что PowerShell является объектно-ориентированным; если сомневаетесь, ищите недвижимостьВот как я бы это сделал, вам не нужен get-контент:
или
Чтобы увидеть, что различные свойства ...
Это быстрее Второй аргумент -filter:
источник
select Pattern, LineNumber, Filename
для более краткого вывода. Строка возвращает ВСЕ в строке, содержащей строку шаблона. Вы также можете легко вывести это в CSV, если хотите.Это даст вам полную информацию обо всех файлах
источник
-r
сработало. Я подумал, что ты всегда должен был это делать-Recurse
Чтобы сохранить полную информацию о файле в результирующем массиве, вы можете использовать небольшую модификацию ответа, опубликованного vikas368 (который, похоже, плохо работает с автозаполнением ISE):
или короче говоря:
источник
Если вы ищете в одном каталоге, вы можете сделать это:
источник
Это отобразит список полного пути к каждому файлу, который содержит строку поиска:
Обратите внимание, что он не отображает заголовок над результатами и не отображает строки текста, содержащие строку поиска. Все, что он говорит вам, это где вы можете найти файлы, которые содержат строку.
источник
Я изменил один из ответов выше, чтобы дать мне немного больше информации. Это избавило меня от второго запроса позже. Это было что-то вроде этого:
Я могу указать путь и подстановочные знаки файла с этими структурами, и это сохраняет имя файла, номер строки и соответствующую строку в выходной файл.
источник