Удалить файлы из всех подкаталогов, сохраняя структуру папок, за исключением одного подкаталога - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь удалить все файлы из всех подкаталогов, сохраняя при этом структуру папок, но исключая удаление файлов за октябрь 2019 года в каждом подкаталоге ⇒ root_dir\*\2019\October\

Каталогструктура выглядит следующим образом:

C:\Users\User1\Documents\MyFolder
├───Directory1
│   ├───2018
│   │   ├───April
│   │   │   └───Error
│   │   ├───August
│   │   │   └───Error
│   │   ├───February
│   │   │   └───Error
│   │   ├───January
│   │   │   └───Error
│   │   ├───July
│   │   │   └───Error
│   │   ├───June
│   │   │   └───Error
│   │   ├───March
│   │   │   └───Error
│   │   ├───May
│   │   │   └───Error
│   │   ├───October
│   │   │   └───Error
│   │   └───September
│   │       └───Error
│   └───2019
│       ├───April
│       │   └───Error
│       ├───August
│       │   └───Error
│       ├───February
│       │   └───Error
│       ├───January
│       │   └───Error
│       ├───July
│       │   └───Error
│       ├───June
│       │   └───Error
│       ├───March
│       │   └───Error
│       ├───May
│       │   └───Error
│       ├───October
│       │   └───Error
│       └───September
│           └───Error
└───Directory2
    ├───2018
    │   ├───April
    │   │   └───Error
    │   ├───August
    │   │   └───Error
    │   ├───February
    │   │   └───Error
    │   ├───January
    │   │   └───Error
    │   ├───July
    │   │   └───Error
    │   ├───June
    │   │   └───Error
    │   ├───March
    │   │   └───Error
    │   ├───May
    │   │   └───Error
    │   ├───October
    │   │   └───Error
    │   └───September
    │       └───Error
    └───2019
        ├───April
        │   └───Error
        ├───August
        │   └───Error
        ├───February
        │   └───Error
        ├───January
        │   └───Error
        ├───July
        │   └───Error
        ├───June
        │   └───Error
        ├───March
        │   └───Error
        ├───May
        │   └───Error
        ├───October
        │   └───Error
        └───September
            └───Error

Из документов Microsoft PowerShell я должен иметь возможность подстановки пути исключения. Я пробовал несколько вариантов, но вот где я сейчас нахожусь:

$root     = 'C:\Users\User1\Documents\MyFolder'
$excludes = 'C:\Users\User1\Documents\MyFolder\*\2019\October\'

Get-ChildItem $root -Directory -Exclude $excludes | ForEach-Object {
    Get-ChildItem $_.FullName -File -Recurse -Force | Remove-Item -Force
}

Вышеприведенное работает, за исключением того, что все еще удаляются файлы из C:\Users\User1\Documents\MyFolder\Directory1\2019\October\* и C:\Users\User1\Documents\MyFolder\Directory2\2019\October\*

I 'мы пытались указать .\2019\October\*.*, но это тоже не сработало.

1 Ответ

2 голосов
/ 07 октября 2019

Я предлагаю другой подход:

$root     = 'C:\Users\User1\Documents\MyFolder'
$excludes = '*\2019\October\*'

Get-ChildItem $root -File -Recurse |
  Where-Object FullName -notlike $excludes |
    Remove-Item -Force -WhatIf

-WhatIf превью операция удаления;удалите его, чтобы выполнить фактическое удаление.

Для простоты все файлы в поддереве перечислены, а затем отфильтрованы по тому, содержат ли их полные пути \2019\October\ компоненты пути.


Что касается того, что вы пытались :

$excludes = 'C:\Users\User1\Documents\MyFolder\*\2019\October\'

Параметр -Exclude поддерживает только файл name pattern, not full paths - хотя на GitHub имеется ожидающий запрос функции для добавления поддержки путей.

Также с использованием Get-ChildItem -Exclude без -Recurse работает не так, как ожидалось: исключение применяется только к входному пути * только 1040 * - см. эту проблему GitHub .

...