Представьте меня есть структура каталогов, как так:Сравнивая родительский каталог, против другого каталога в котором труба
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 ниже корневого каталога, отфильтровывает не-каталоги, идет вверх от одного до промежуточных каталогов, затем отфильтровывает любой каталог, который не является ребенок корневого каталога.
Это возвращает пустой список.
Однако если изменить последний пункт, где следующим образом:
? { $_.Parent.FullName -eq $rootDir.Fullname }
Он работает, и я получаю правильный вывод каталогов.
Так что мой вопрос: почему не будет напрямую сравнивать объекты каталога? Это может показаться мелочью, но это означает, что в моем понимании объектов powershell есть какая-то дыра.
(Кроме того, не стесняйтесь критиковать мой стиль кодирования Powershell в сценарии, или указать на более быстрый/более правильные способы сделать это)
Я бы, наверное, написать, что, как 'GCI | ? {$ _. psiscontainer -and (test-path $ _ \ foo)} '... – Joey
@ Йоханнес Россель хе-хе это гораздо более краткий; Благодарю. – tenpn