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