Представете си, че имам такава структура на директория:
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