Powershellでフォルダ内のファイル削除を実施時に、特定のフォルダだけ除外したい


表題の通りですが、以下のような感じで特定のフォルダだけ削除を実施したくないのですが  
上手くいきません。

なにか方法はないでしょうか？

[code]

    $filePath = 'C:\temp\'　 # 削除対象フォルダ
    $excludeItem = '処理済'　# 削除対象内で除外したいフォルダ
    
    Get-ChildItem -Path $filePath -Exclude $excludeItem -Recurse | Where-Object{$_.LastWriteTime -lt (Get-Date).AddDays(-2)} | Remove-Item -Force -WhatIf
    
[/code]




下記のスクリプトでできます。

[code]

    ls -Path $filePath -Recurse | ?{if($_.PSIsContainer){$_.Name -ne $excludeItem -and (ls $_.FullName -Directory -Filter $excludeItem).Count -eq 0}else{$_.FullName -notmatch $excludeItem}} | rm -Recurse  -Force -WhatIf
    
[/code]

**解説**

ご質問の通りフォルダの`-Exclude`はできないので、とりあえず全ファイルを再帰的に取得します。

[code]

    ls -Path $filePath -Recurse
    
[/code]

単純に次のWhere-Object(エイリアスは`?{}`)でできそうと思いますが、サブフォルダの`$excludeItem`を考慮してくれません。  
つまり`C:\temp\hoge\処理済\`が存在する場合でも、`C:\temp\hoge\`を削除しようとするためNGです。

[code]

    ls -Path $filePath -Recurse | ?{ $_.fullname -notmatch $excludeItem }
    
[/code]

これを回避するために、Where-Objectの中でフォルダとファイルに対する処理を分けました。

[code]

    ?{
        if($_.PSIsContainer){
            # フォルダの場合、フォルダ名が $excludeItem ではない、かつ子フォルダに $excludeItem が一つも存在しない
            $_.Name -ne $excludeItem -and
            (ls $_.FullName -Directory -Filter $excludeItem).Count -eq 0
        }else{
            # ファイルの場合、フルパスに $excludeItem を含まない
            $_.FullName -notmatch $excludeItem
        }
    }
    
[/code]

後は該当のファイルフォルダを削除します。(もちろん`-WhatIf`オプションがあるので実際には消えません)

[code]

     | rm -Recurse -Force -WhatIf
    
[/code]

