Не удается исключить шаблон каталога рекурсивно

30

Я пытаюсь получить дочерние элементы папки рекурсивно. Однако папка содержит файлы шума и папку (на самом деле это папка проекта Visual Studio).

Вот что у меня есть:

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

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

Тем не менее, по- $allItemsпрежнему содержит файлы и папки, соответствующие пути.

Что я сделал не так?

Если быть более точным, я хочу получить как папки, так и файлы, но не указанную папку, а любую ее потомок.

Я также попробовал:

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

    }
}

Но успеха больше нет

Стив Б
источник

Ответы:

44

Мне потребовалось время, чтобы понять проблему. Это хитрый.

-excludeприменяется только к базовым именам элементов (т.е. myfile.txt), а не к полному имени
(т.е. C:\pkgobj\myfile.txt), которое вы хотите. Таким образом, вы не можете использовать исключение здесь.

Но есть обходной путь с использованием Fullnameи-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
источник
1
Однако, если вы хотите исключить большие каталоги из-за производительности (например, node_modules), это не поможет, так как все равно будет рекурсивно проверять все и фильтровать впоследствии.
Pluc
Как насчет этого ? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_