Строка выбора powershell с рекурсией к конкретному файлу

Я почти уверен, что строка выбора Powershell будет работать для меня с небольшой рекурсией Get-ChildItem.

У меня есть много каталогов, как это:

abc_123
abc_345
abc_567
abc_890
abc_111
abc_569

В каждом каталоге есть определенный файл с одинаковым путем к каждому файлу в каждом каталоге:

abc_123:\AAA\SDK\Settings\foo.settings.xml
abc_345:\AAA\SDK\Settings\foo.settings.xml
abc_567:\AAA\SDK\Settings\foo.settings.xml

И так далее.

В файле foo.settings.xml я хочу найти "BAR". а также на одну строку ниже:

  <name="BAR.ABB"
            default="1"

Проблема, которая у меня возникла, находится в каталоге, в котором есть abc_123,abc_345,abc_567 и т. Д., Есть другие каталоги, которые также содержат BAR.*. Мне плевать на эти результаты.

Я пытаюсь что-то вроде этого, но это не работает.

Get-ChildItem -Recurse *.* | Select-String -Pattern "BAR.*" foo.settings.xml | Select-Object -Unique Path

Где в моей команде я могу указать, что я хочу искать каталоги, начинающиеся с abc_ и по этому конкретному пути?

--- редактировать ---

Путь всегда начинается с abc_*, и foo.settings.xml всегда имеет этот путь:abc_*:\AAA\SDK\Settings\foo.settings.xml

Я попробовал это:Get-ChildItem -Recurse | Where-Object {"abc_*"} | Select-String –Pattern "BAR.*", но это, кажется, дает те же результаты сверху.

1 ответ

Решение

В вашей линии Get-ChildItem -Recurse *.* вы указываете, что вы хотите все файлы с любым расширением, потому что *.* является обязательным для -Filter параметр.

Чтобы получить все файлы, начинающиеся с пути abc_* и всегда с одинаковым относительным путем, вы можете сделать что-то вроде этого: Get-ChildItem -Recurse | Where-Object {$_.FullName -like 'abc_*:\AAA\SDK\Settings\foo.settings.xml'} | Select-String ...

Однако, учитывая, что каждый файл foo.settings.xml находится в одном и том же относительном каталоге, это кажется относительно неэффективным, если принять во внимание большое количество подкаталогов в каждом abc_* реж. Лучшее решение в этом случае было бы что-то вроде:

(где $Path - корневой путь к папке со всеми каталогами abc_*)

Get-ChildItem $Path -Filter abc_* | Foreach-Object {Select-String -Path "$($_.FullName)\AAA\SDK\Settings\foo.settings.xml" -Pattern "BAR.*"}

Другие вопросы по тегам