Строка выбора 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.*"}