Nie można wykluczyć rekursywnie wzorca katalogu

30

Próbuję rekursywnie uzyskać elementy potomne folderu. Jednak folder zawiera pliki szumu i folder (w rzeczywistości jest to folder projektu Visual Studio).

Oto co mam:

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

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

Jednak $allItemsnadal zawiera pliki i foldery pasujące do ścieżek.

Co zrobiłem źle?

Mówiąc ściślej, chcę uzyskać zarówno foldery, jak i pliki, ale nie określony folder i jego potomek.

Próbowałem też:

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

    }
}

Ale koniec sukcesów

Steve B.
źródło

Odpowiedzi:

44

Zajęło mi chwilę, aby zrozumieć problem. To trudne.

-excludedotyczy tylko basename elementów (tj. myfile.txt), a nie pełnej nazwy
(tj. C:\pkgobj\myfile.txt), którą chcesz. Więc nie możesz użyć wykluczenia tutaj.

Ale istnieje obejście przy użyciu Fullnamei-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
źródło
1
Jeśli jednak chcesz wykluczyć duże katalogi ze względu na wydajność (np. Moduły_węzła), to nie pomoże, ponieważ nadal będzie rekurencyjnie sprawdzać wszystko i filtrować później.
Pluc
A co z tym ? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_