Can't exclude a directory pattern recursively
I'm trying to get child items of a folder recursively. However the folder contains noise files and folder (actually, this is a Visual Studio project folder).
Here what I have:
$root = Get-Item C:\Projects\MyProject
$allItems = Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"However, $allItems still contains files and folder matching the paths.
What I did wrong?
To be more precise, I want to get both folders and files, but not the specified folder, and any of its descendant.
I also tried:
foreach($item in $allItems){ if($item.FullName -notmatch "pkgobj") { Write-Host -ForegroundColor Green $item.FullName.Replace($root,'') }
}But no more success
2 Answers
Took me a moment to understand the issue. Its a tricky one.
-exclude only applies to basenames of items (i.e. myfile.txt), not the fullname
(i.e. C:\pkgobj\myfile.txt) which you want. So you can't use exclude here.
But there is a workaround using Fullname and -notlike
$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 2 You want to avoid where statements when you can for performance reasons. To simplify a previous answer.
Get-childitem -path c:\windows -exclude 'temp' | get-childitem -recurse 1 More in general
"Zoraya ter Beek, age 29, just died by assisted suicide in the Netherlands. She was physically healthy, but psychologically depressed. It's an abomination that an entire society would actively facilitate, even encourage, someone ending their own life because they had no hope. Th…"