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

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

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_
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.