Неможливо виключити шаблон каталогу рекурсивно


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

1
Однак, якщо ви хочете виключити великі каталоги завдяки продуктивності (наприклад, node_modules), це не допоможе, оскільки воно все одно буде рекурсивно перевіряти все та фільтрувати згодом.
Pluc

Як що до цього ? Get-ChildItem -Exclude виключити_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.