首页 > 解决方案 > 从保留文件夹结构的所有子目录中删除文件,除了一个子目录

问题描述

我正在尝试从所有子目录中删除所有文件,同时保留文件夹的结构,但不包括从每个子目录中删除 2019 年 10 月的文件⇒root_dir\*\2019\October\

目录结构如下所示:

C:\Users\User1\Documents\MyFolder
├───目录1
│ ├───2018
│ │ ├───四月
│ │ │ └───错误
│ │ ├───八月
│ │ │ └───错误
│ │ ├───二月
│ │ │ └───错误
│ │ ├───一月
│ │ │ └───错误
│ │ ├───七月
│ │ │ └───错误
│ │ ├───六月
│ │ │ └───错误
│ │ ├───三月
│ │ │ └───错误
│ │ ├───五月
│ │ │ └───错误
│ │ ├───十月
│ │ │ └───错误
│ │ └───九月
│ │ └───错误
│ └───2019
│ ├───四月
│ │ └───错误
│ ├───八月
│ │ └───错误
│ ├───二月
│ │ └───错误
│ ├───一月
│ │ └───错误
│ ├───七月
│ │ └───错误
│ ├───六月
│ │ └───错误
│ ├───三月
│ │ └───错误
│ ├───五月
│ │ └───错误
│ ├───十月
│ │ └───错误
│ └───九月
│ └───错误
└────目录2
    ├───2018
    │ ├───四月
    │ │ └───错误
    │ ├───八月
    │ │ └───错误
    │ ├───二月
    │ │ └───错误
    │ ├───一月
    │ │ └───错误
    │ ├───七月
    │ │ └───错误
    │ ├───六月
    │ │ └───错误
    │ ├───三月
    │ │ └───错误
    │ ├───五月
    │ │ └───错误
    │ ├───十月
    │ │ └───错误
    │ └───九月
    │ └───错误
    └────2019
        ├────四月
        │ └───错误
        ├────八月
        │ └───错误
        ├────二月
        │ └───错误
        ├────一月
        │ └───错误
        ├────七月
        │ └───错误
        ├────六月
        │ └───错误
        ├────三月
        │ └───错误
        ├────五月
        │ └───错误
        ├────十月
        │ └───错误
        └────九月
            └───错误

从 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\*

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

标签: powershellpowershell-4.0

解决方案


我建议一种不同的方法:

$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参数仅支持文件模式,不支持完整路径- 尽管GitHub 上有一个待处理的功能请求以添加对路径的支持。

此外,使用Get-ChildItem -Exclude without-Recurse不会像人们期望的那样工作:然后仅将排除应用于输入路径- 请参阅此 GitHub 问题


推荐阅读