Não é possível excluir um padrão de diretório recursivamente

30

Estou tentando obter itens filho de uma pasta recursivamente. No entanto, a pasta contém arquivos e pasta de ruído (na verdade, essa é uma pasta de projeto do Visual Studio).

Aqui o que eu tenho:

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

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

No entanto, $allItemsainda contém arquivos e pastas correspondentes aos caminhos.

O que eu fiz de errado?

Para ser mais preciso, desejo obter pastas e arquivos, mas não a pasta especificada e qualquer um de seus descendentes.

Eu também tentei:

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

    }
}

Mas não há mais sucesso

Steve B
fonte

Respostas:

44

Levei um momento para entender o problema. É complicado.

-excludeaplica-se apenas aos nomes de base dos itens (ie myfile.txt), não ao nome completo
(ie C:\pkgobj\myfile.txt) que você deseja. Portanto, você não pode usar excluir aqui.

Mas há uma solução alternativa usando Fullnamee-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
nixda
fonte
1
No entanto, se você quiser excluir grandes diretórios devido ao desempenho (como node_modules), isso não ajudará, pois ainda verificará recursivamente tudo e filtrará posteriormente.
Pluc 26/02
E isso? Get-ChildItem -Exclude exclude_dir | foreach {Get-ChildItem -Path $ _ -Include * .include -Recurse -Exclude * .excludefile | foreach {echo $ _}}
NN_