避免在PowerShell中递归获取特定文件夹

时间:2013-01-18 22:23:54

标签: powershell get-childitem

我有一个包含多个项目的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文件夹。

2 个答案:

答案 0 :(得分: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对this post的回答;我的贡献是一个bug修复和次要重构;你会在我对同一个问题的回答中找到一个完整的解释。

此调用应该满足您的需求:

GetFiles -path source -exclude FILE_DATA

有关更悠闲的阅读,请查看我在Simple-Talk.com上讨论此内容的文章:Practical PowerShell: Pruning File Trees and Extending Cmdlets

答案 1 :(得分: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
}