Представьте, что у меня есть такая структура каталогов:
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 в сценариях или указывать более быстрые/более правильные способы сделать это)
gci | ?{ $_.psiscontainer -and (test-path $_\foo) }
... - person Joey   schedule 29.06.2010