Imaginez-je une structure de répertoire parent d'un répertoire comme ceci:comparaison contre un autre répertoire dans un où tuyau
parentDir\dirA\foo\
parentDir\dirB\foo\
parentDir\dirC\
parentDir\dirD\bar\foo\
parentDir\dirE\foo\
parentDir\dirF\
Je veux sélectionner uniquement les répertoires qui a) sont des enfants immédiats de parentdir, et b) ont un répertoire foo en tant qu'enfant immédiat.
Ainsi, les répertoires A, B et E sont admissibles, tandis que C, D et F ne le sont pas.
j'ai essayé ce script Powershell:
$rootDir = gi(".")
dir -include "*foo*" -recurse | ? {$_.PSIsContainer -eq $true} | % {$_.Parent}
| ? { $_.Parent -eq $rootDir }
Il trouve tous les éléments de foo en dessous du répertoire racine, filtre les non-répertoires, monte un aux répertoires intermédiaires, puis des filtres sur un répertoire qui n'est pas un enfant de la racine
Ceci retourne une liste vide.
Cependant, si je change la dernière clause where comme suit:
? { $_.Parent.FullName -eq $rootDir.Fullname }
Il fonctionne, et je reçois la sortie des répertoires corrects. Donc, ma question est la suivante: pourquoi une comparaison directe entre les objets répertoire ne fonctionne-t-elle pas? Cela peut sembler une petite chose mais cela implique qu'il y a un trou dans ma compréhension des objets PowerShell.
(Aussi, ne hésitez pas à critiquer mon powershell style de codage dans les scripts, ou indiquer des moyens plus rapides/plus correct de le faire)
je serais probablement écrire que 'DCG | ? {$ _. psiscontainer -et (test-path $ _ \ foo)} '... – Joey
@Johannes Rossel heh c'est beaucoup plus concis; Merci. – tenpn