Ein Verzeichnismuster kann nicht rekursiv ausgeschlossen werden

30

Ich versuche, untergeordnete Elemente eines Ordners rekursiv abzurufen. Der Ordner enthält jedoch Rauschdateien und -ordner (tatsächlich handelt es sich hierbei um einen Visual Studio-Projektordner).

Hier was ich habe:

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

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

$allItemsEnthält jedoch weiterhin Dateien und Ordner, die den Pfaden entsprechen.

Was habe ich falsch gemacht?

Um genauer zu sein, möchte ich sowohl Ordner als auch Dateien abrufen, aber nicht den angegebenen Ordner und einen seiner Nachkommen.

Ich habe auch versucht:

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

    }
}

Aber kein Erfolg mehr

Steve B
quelle

Antworten:

44

Ich brauchte einen Moment, um das Problem zu verstehen. Es ist eine schwierige Frage.

-excludeGilt nur für Basisnamen von Elementen (dh myfile.txt), nicht für den vollständigen Namen
(dh C:\pkgobj\myfile.txt), den Sie möchten. Sie können hier also nicht ausschließen .

Es gibt jedoch eine Problemumgehung mit Fullnameund-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
Nixda
quelle
1
Wenn Sie jedoch große Verzeichnisse aufgrund der Leistung ausschließen möchten (z. B. node_modules), hilft dies nicht, da immer noch alles rekursiv überprüft und anschließend gefiltert wird.
Pluc
Was ist damit? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_