Bir dizin desenini yinelemeli olarak hariç tutamaz


30

Bir klasörün alt öğelerini tekrar tekrar çekmeye çalışıyorum. Bununla birlikte, klasör gürültü dosyalarını ve klasörünü içerir (aslında, bu bir Visual Studio proje klasörüdür).

İşte elimde ne var:

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

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

Ancak, $allItemsyine de yollarla eşleşen dosya ve klasörleri içerir.

Neyi yanlış yaptım?

Daha kesin olmak gerekirse, hem klasörleri hem dosyaları almak istiyorum, ancak belirtilen klasörü ve soyundan birini almak istemiyorum.

Ben de denedim:

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

    }
}

Ama artık başarı yok

Yanıtlar:


44

Bu konuyu anlamak için bana bir dakika sürdü. Bu zor bir tane.

-excludeyalnızca öğelerin myfile.txttemel adlarına
(yani C:\pkgobj\myfile.txt) uygulanır, istediğiniz tam adı (yani ) kullanmaz. Yani burada dışlamayı kullanamazsınız .

Ancak Fullnameve kullanarak bir geçici çözüm var.-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 

1
Ancak, performans nedeniyle büyük dizinleri hariç tutmak istiyorsanız (node_modules gibi), her şeyi tekrar tekrar kontrol edip daha sonra filtreleyeceğiniz için bu yardımcı olmaz.
Pluc

Peki buna ne dersin ? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.