No se puede excluir un patrón de directorio de forma recursiva

29

Estoy tratando de obtener elementos secundarios de una carpeta de forma recursiva. Sin embargo, la carpeta contiene archivos y carpetas de ruido (en realidad, esta es una carpeta de proyecto de Visual Studio).

Aquí lo que tengo:

$root = Get-Item C:\Projects\MyProject

$allItems =  Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"

Sin embargo, $allItemstodavía contiene archivos y carpetas que coinciden con las rutas.

¿Que hice mal?

Para ser más precisos, quiero obtener carpetas y archivos, pero no la carpeta especificada y ninguno de sus descendientes.

También probé:

foreach($item in $allItems){
    if($item.FullName -notmatch "pkgobj") {
        Write-Host -ForegroundColor Green $item.FullName.Replace($root,'')

    }
}

Pero no mas exito

Steve B
fuente

Respuestas:

42

Me tomó un momento entender el problema. Es complicado.

-excludesolo se aplica a los nombres básicos de los elementos (es decir myfile.txt), no al nombre completo
(es decir C:\pkgobj\myfile.txt) que desea. Por lo tanto, no puede usar excluir aquí.

Pero hay una solución alternativa usando Fullnamey-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
fuente
1
Sin embargo, si desea excluir directorios grandes debido al rendimiento (como node_modules), esto no ayudará, ya que aún verificará recursivamente todo y filtrará después.
Pluc
¿Qué hay de esto? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_