3

我有一个包含多个项目的 Visual Studio 解决方案。作为清理的一部分,我使用以下脚本清理了 bin 和 obj 文件夹。

Get-ChildItem -path source -filter obj -recurse | Remove-Item -recurse
Get-ChildItem -path source -filter bin -recurse | Remove-Item -recurse

这完美地工作。但是,我有一个基于文件的数据文件夹,其中包含大约 600,000 个子文件夹,位于名为 FILE_DATA 的文件夹中。

上面的脚本需要很长时间,因为它遍历了所有这 600,000 个文件夹。

当我递归遍历并删除 bin 和 obj 文件夹时,我需要避免使用 FILE_DATA 文件夹。

4

2 回答 2

3

这是一种更有效的方法,可以满足您的需要——跳过要排除的子树:

function GetFiles($path = $pwd, [string[]]$exclude)
{
    foreach ($item in Get-ChildItem $path)
    {
        if ($exclude | Where {$item -like $_}) { continue }

        $item
        if (Test-Path $item.FullName -PathType Container)
        {
            GetFiles $item.FullName $exclude
        }
    }
} 

这段代码改编自 Keith Hill 对这篇文章的回答;我的贡献是修复了一个错误并进行了少量重构;您将在我对同一个 SO 问题的回答中找到完整的解释。

这个调用应该做你需要的:

GetFiles -path source -exclude FILE_DATA

如需更悠闲的阅读,请查看我在 Simple-Talk.com 上的文章,其中讨论了这一点以及更多内容:实用 PowerShell:修剪文件树和扩展 Cmdlet

于 2013-01-20T14:29:53.170 回答
2

如果 FILE_DATA 文件夹是 $source 的子文件夹(不是更深),请尝试:

$source = "C:\Users\Frode\Desktop\test"
Get-Item -Path $source\* -Exclude "FILE_DATA" | ? {$_.PSIsContainer} | % {
    Get-ChildItem -Path $_.FullName -Filter "obj" -Recurse | Remove-Item -Recurse
    Get-ChildItem -Path $_.FullName -Filter "bin" -Recurse | Remove-Item -Recurse
}
于 2013-01-19T09:10:10.513 回答