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

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\*"} 

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_
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.