Impossibile escludere ricorsivamente un modello di directory


30

Sto cercando di ottenere ricorsivamente gli elementi figlio di una cartella. Tuttavia, la cartella contiene file e cartelle di rumore (in realtà, si tratta di una cartella di progetto di Visual Studio).

Ecco cosa ho:

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

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

Tuttavia, $allItemscontiene ancora file e cartelle corrispondenti ai percorsi.

Cosa ho sbagliato?

Per essere più precisi, voglio ottenere sia le cartelle che i file, ma non la cartella specificata e nessuno dei suoi discendenti.

Ho anche provato:

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

    }
}

Ma non più successo

Risposte:


44

Mi ci è voluto un momento per capire il problema. È difficile.

-excludesi applica solo ai nomi di base degli elementi (ad es. myfile.txt), non al nome completo
(ad es. C:\pkgobj\myfile.txt) che si desidera. Quindi non puoi usare exclude qui.

Ma c'è una soluzione alternativa usando Fullnamee-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 

1
Tuttavia, se si desidera escludere directory di grandi dimensioni a causa delle prestazioni (come node_modules), questo non sarà di aiuto poiché controllerà in modo ricorsivo tutto e filtrerà in seguito.
Pluc

Che dire di questo ? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.