Get-ChildItem: показывать только папки, в которых нет определенного файла.

Первый пост на платформе ;-)

Сценарий: у меня есть корневая папка, содержащая вложенные папки с файлами, связанными с установкой. Некоторые подпапки содержат больше подпапок с большим количеством файлов, подпапок. Каждая из подпапок в корневой папке или их подпапках ДОЛЖНА содержать один конкретный файл.

Теперь я хочу, чтобы все подпапки находились непосредственно под корневой папкой, КОТОРЫЕ НЕ ВКЛЮЧАЮТ этот конкретный файл, ни в самой подпапке, ни в других подпапках ниже. Мне нужны только имена подпапок под корнем. Поиск должен быть рекурсивным, конечно.

Мой текущий код выглядит так:

Get-ChildItem $softwarePath -Recurse | ? Name -notlike "Prefix_*.cmd"

К сожалению, результат очень большой и включает в себя все файлы в каждой подпапке. Мое пожелание: получить только имена подпапок под корнем, чтобы проверить, почему этого конкретного файла там нет.


person Community    schedule 06.08.2015    source источник


Ответы (2)


Добро пожаловать в stackoverflow!

Вы почти там. Вот решение, в котором я сначала извлекаю все подпапки $softwarePath, а затем выбираю только ту, которая не содержит файл:

Get-ChildItem $softwarePath -Directory | 
? { -not (Get-ChildItem $_.FullName -Recurse -File -Filter 'Prefix_*.cmd')}
person Martin Brandl    schedule 06.08.2015
comment
Возможно, добавить параметр -File ко второму вызову gci - person Mathias R. Jessen; 06.08.2015
comment
Вау! Это работает идеально. Большое спасибо! Вы решили мою проблему! - person ; 06.08.2015

Хотя подход @jisaak отлично решает вашу проблему, вы можете обнаружить, что накладные расходы на получение FileInfo объектов для каждого файла в вашей огромной структуре каталогов могут привести к тому, что выполнение скрипта займет некоторое время.

Если это так, вы можете ускорить процесс, получив только имя файла с помощью метода Directory.GetFiles():

Get-ChildItem $softwarePath -Directory |Where-Object { 
    -not ([System.IO.Directory]::GetFiles($_.FullName,'Prefix_*.cmd',"AllDirectories"))
}
person Mathias R. Jessen    schedule 06.08.2015
comment
Спасибо за этот разумный подход. На самом деле, это немного быстрее! - person ; 06.08.2015