不能递归排除目录模式

Ste*_*e B 34 powershell

我正在尝试递归获取文件夹的子项。但是该文件夹包含噪声文件和文件夹(实际上,这是一个 Visual Studio 项目文件夹)。

这是我所拥有的:

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

$allItems =  Get-ChildItem $root -Recurse -exclude "**\pkgobj\*"
Run Code Online (Sandbox Code Playgroud)

但是,$allItems仍然包含与路径匹配的文件和文件夹。

我做错了什么?

更准确地说,我想同时获取文件夹和文件,而不是指定的文件夹及其任何后代。

我也试过:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

但没有更多的成功

nix*_*xda 53

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

-exclude仅适用于项目的基本名称(即myfile.txt),而不适用于您想要的全名
(即C:\pkgobj\myfile.txt)。所以你不能在这里使用exclude

但是有一种解决方法是使用Fullname-notlike

$root = "C:\Projects\MyProject"
$allitems = Get-ChildItem $root -Recurse | Where {$_.FullName -notlike "*\pkgobj\*"} 
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果由于性能(如 node_modules)而想要排除大目录,这将无济于事,因为它仍然会递归检查所有内容并在之后进行过滤。 (3认同)