具有递归的Remove-Item并排除多个子目录

时间:2019-01-24 19:08:08

标签: powershell bamboo

我正在尝试创建一个脚本,以删除文件夹中的所有文件和目录,为指定文件夹及其内容之外。

示例树:

test/
    - images/
        - folder_to_keep/
        - misc/
        - blah/
    - some_other_folder/
        - another_to_keep/
        - snafu/

我很幸运地搜索了这个特定问题。我尝试过:

Remove-Item .\test\* -Exclude (".\test\images\folder_to_keep", ".\test\some_other_folder\another_to_keep") -Recurse

但这仍然会删除所有内容。

仅供参考,如果有帮助,我正在尝试在Atlassian Bamboo服务器上的构建作业中运行此脚本。请参阅:https://confluence.atlassian.com/bamboo0515/script-894237366.html。如果有更好的方法来使用它们的选项(Shell,Windows PowerShell,/ bin / sh或cmd.exe),那也很好。

编辑:robocopy也可以是一个选项。基本问题是我需要镜像源路径和目标路径,但是目标中有一些文件夹必须保持不变(它们从另一个进程填充)。

1 个答案:

答案 0 :(得分:2)

-Exclude仅适用于叶子元素,而不适用于完整路径。例如,过滤器-Exclude 'foo'将从结果列表中删除名为“ foo”的文件夹,但不会删除其文件或子文件夹。

在正则表达式中合并要排除的父路径,并使用正则表达式(非)匹配。

$excludes = "$($pwd.Path)\test\images\folder_to_keep",
            "$($pwd.Path)\test\some_other_folder\another_to_keep"

$re = ($excludes | ForEach-Object {[regex]::Escape($_)}) -join '|'

Get-ChildItem -Recurse -Force | Where-Object {
    $_.FullName -notmatch "^$re"
} | Remove-Item -Force