Remove-Item с Recurse и Exclude несколько подкаталогов - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь создать сценарий для удаления всех файлов и каталогов в папке, за исключением для указанных папок и их содержимого.

Пример дерева:

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 голосов
/ 24 января 2019

-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
...