Impossible d'exclure un modèle de répertoire de manière récursive

30

J'essaie d'obtenir les éléments enfants d'un dossier de manière récursive. Cependant, le dossier contient des fichiers de bruit et un dossier (en fait, il s'agit d'un dossier de projet Visual Studio).

Voici ce que j'ai:

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

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

Cependant, $allItemscontient toujours des fichiers et un dossier correspondant aux chemins.

Qu'est-ce que j'ai fait de mal?

Pour être plus précis, je veux obtenir à la fois les dossiers et les fichiers, mais pas le dossier spécifié, ni aucun de ses descendants.

J'ai aussi essayé:

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

    }
}

Mais plus de succès

Steve B
la source

Réponses:

44

Cela m'a pris un moment pour comprendre le problème. C'est délicat.

-excludene s'applique qu'aux noms de base des éléments (ie myfile.txt), pas au nom complet
(ie C:\pkgobj\myfile.txt) que vous souhaitez. Vous ne pouvez donc pas utiliser l' exclusion ici.

Mais il existe une solution de contournement en utilisant Fullnameet-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
la source
1
Cependant, si vous souhaitez exclure des répertoires volumineux en raison des performances (comme node_modules), cela ne vous sera d'aucune utilité car il continuera à tout vérifier récursivement et à filtrer par la suite.
Pluc
Et ça ? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_