Представьте, что у меня есть структура каталогов, например:
parentDir\dirA\foo\
parentDir\dirB\foo\
parentDir\dirC\
parentDir\dirD\bar\foo\
parentDir\dirE\foo\
parentDir\dirF\
Я хочу выбрать только каталоги, которые а) являются непосредственными потомками parentDir и б) имеют каталог foo в качестве непосредственного потомка.
Таким образом, категории A, B и E соответствуют требованиям, а C, D и F. - нет.
Я впервые попробовал этот скрипт powershell:
$rootDir = gi(".")
dir -include "*foo*" -recurse | ? {$_.PSIsContainer -eq $true} | % {$_.Parent}
| ? { $_.Parent -eq $rootDir }
Он находит все элементы foo ниже корневого каталога, отфильтровывает не-каталоги, переходит один в промежуточные каталоги, затем отфильтровывает любой каталог, который не является дочерним для корневого каталога.
Возвращает пустой список.
Однако, если я изменю последнее предложение where следующим образом:
? { $_.Parent.FullName -eq $rootDir.Fullname }
Это работает, и я получаю правильный вывод каталогов.
Итак, мой вопрос: почему не работает прямое сравнение между объектами каталога? Это может показаться мелочью, но это подразумевает, что в моем понимании объектов powershell есть некоторая дыра.
(Кроме того, не стесняйтесь критиковать мой стиль кодирования powershell в сценариях или указывать более быстрые / более правильные способы сделать это)