Tidak dapat mengecualikan pola direktori secara rekursif

30

Saya mencoba mendapatkan item anak dari folder secara rekursif. Namun folder tersebut berisi file noise dan folder (sebenarnya, ini adalah folder proyek Visual Studio).

Di sini apa yang saya miliki:

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

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

Namun, $allItemsmasih berisi file dan folder yang cocok dengan jalurnya.

Apa yang saya lakukan salah?

Untuk lebih tepatnya, saya ingin mendapatkan folder dan file, tetapi bukan folder yang ditentukan, dan salah satu turunannya.

Saya juga mencoba:

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

    }
}

Tetapi tidak ada lagi kesuksesan

Steve B
sumber

Jawaban:

44

Butuh waktu sejenak untuk memahami masalah ini. Yang rumit.

-excludehanya berlaku untuk nama dasar item (yaitu myfile.txt), bukan nama lengkap
(yaitu C:\pkgobj\myfile.txt) yang Anda inginkan. Jadi Anda tidak dapat menggunakan kecualikan di sini.

Tetapi ada solusi menggunakan Fullnamedan-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
sumber
1
Namun, jika Anda ingin mengecualikan direktori besar karena kinerja (seperti node_modules), ini tidak akan membantu karena masih akan memeriksa semuanya secara rekursif dan memfilter setelahnya.
Pluc
Bagaimana dengan ini ? Dapatkan-ChildItem -Kecualikan exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_