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 の回答を基にしています。私の貢献は、1 つのバグ修正とマイナーなリファクタリングです。同じSOの質問に対する私の回答に完全な説明があります。

この呼び出しは、必要なことを行う必要があります。

GetFiles -path source -exclude FILE_DATA

さらにゆっくりと読むには、Simple-Talk.com にある私の記事をチェックしてください。この記事では、このことについて詳しく説明しています: Practical PowerShell: Pruning File Trees and Extending Cmdlets .

于 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 に答える