从保留文件夹结构的所有子目录中删除文件,除了一个子目录

Delete files from all subdirectories keeping folder structure except for one subdirectory

我正在尝试从所有子目录中删除所有文件,同时保留文件夹结构,但不包括从 2019 年 10 月开始删除每个子目录中的文件⇒ root_dir\*19\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\*19\October\'

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

除了仍然从 C:\Users\User1\Documents\MyFolder\Directory119\October\*C:\Users\User1\Documents\MyFolder\Directory219\October\*

中删除文件外,上述方法有效

我试过指定 .19\October\*.* 但这似乎也不起作用。

我建议采用不同的方法:

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

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

-WhatIf 预览删除操作;删除它以执行实际删除。

为简单起见,枚举子树中的所有个文件,然后根据它们的完整路径是否包含19\October\个路径组件进行筛选。


至于你试过的

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

-Exclude 参数仅支持文件 name 模式,不支持完整的 paths - 虽然有待处理的 feature request on GitHub 添加对路径的支持。

此外,在没有 -Recurse 的情况下使用 Get-ChildItem -Exclude 并不像人们预期的那样工作:然后将排除应用于 仅输入路径 - 请参阅 this GitHub issue.