无法以递归方式排除目录模式

无法以递归方式排除目录模式

我正在尝试递归获取文件夹的子项。但是该文件夹包含噪音文件和文件夹(实际上,这是一个 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,'')

    }
}

但没有再成功

答案1

我花了一点时间才理解这个问题。这是一个棘手的问题。

-exclude仅适用于项目的基本名称(即myfile.txt),而不是您想要的全名
(即C:\pkgobj\myfile.txt)。因此您不能使用排除这里。

但有一个解决方法,使用Fullname-notlike

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

答案2

出于性能原因,您希望尽可能避免使用 where 语句。为了简化先前的答案。

Get-childitem -path c:\windows -exclude 'temp' | get-childitem -recurse

相关内容