从保留文件夹结构的所有子目录中删除文件,除了一个子目录
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.
我正在尝试从所有子目录中删除所有文件,同时保留文件夹结构,但不包括从 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.