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

946
Registered User

Я почти уверен, что строка выбора 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.*"но это, кажется, дает те же результаты сверху.

3

1 ответ на вопрос

2
Bryan Winstead

В вашей строке 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

Это правильно выберет abc *, но не будет искать в этих каталогах и находить foo.settings.xml. Файл foo находится в трех каталогах под abc *. Registered User 8 лет назад 0
Я неправильно понял тогда. Итак, вам нужно будет дополнительно уточнить проблему. Всегда ли путь должен _start_ с `abc`, или он просто _contain_` abc` где-то в имени пути? В любом случае ответ заключается в следующем: `Get-ChildItem -Recurse | Where-Object {"фильтр для соответствующих путей здесь"} | Select-String ... `Единственное, что меняется, это« фильтр для соответствующих путей здесь » Bryan Winstead 8 лет назад 0
Почему бы не только рекурсивно просматривать структуры каталогов, которые соответствуют требуемому формату? Например, `Get-ChildItem -Recurse abc * \ AAA \ SDK \ Settings \ *. *` root 8 лет назад 0
Параметр `-Filter` в Get-ChildItem очень ограничен. Я вполне уверен, что он работает только с именами файлов, а не с целыми путями, что делает `Where-Object` способом продвижения вперед. Bryan Winstead 8 лет назад 0
@BryanWinstead, да, путь всегда будет abc_ *, а путь к foo.settings.xml всегда одинаков. Отредактированный основной вопрос. Можете ли вы показать пример с этой информацией? Registered User 8 лет назад 0
@RegisteredUser Я обновил вопрос тем, что, я думаю, вы ищете. Дайте мне знать, если есть еще одно недоразумение. Bryan Winstead 8 лет назад 0
Привет @BryanWinstead, это прекрасно работает! Спасибо, что нашли время, чтобы обновить свой ответ. Registered User 8 лет назад 0