我有一个看起来像这样的文件夹结构
-2018
--01-Jan
--02-Feb
--etc
-2017
--01-Jan
--02-Feb
--etc
是否有一种方法可以删除所有7年以上的目录(根据此命名结构...并非根据创建/修改日期等)?
所以,如果我在2018年8月运行它,我将被留下
-2018
-2017
-2016
-2015
-2014
-2013
-2012
-2011
--08-Aug
--09-Sep
--10-Oct
--11-Nov
--12-Dec
因此2012-2018年文件夹将保持不变。 任何文件夹2010及更早版本都将被删除。 并且所有在2011年7月7日或更小的文件夹都将被删除。
谢谢 P
答案 0 :(得分:1)
我首先使用以下代码创建了可比较的文件夹结构:
##
## define enum for months
##
enum month {
Jan = 1
Feb = 2
Mar = 3
Apr = 4
May = 5
Jun = 6
Jul = 7
Aug = 8
Sep = 9
Oct = 10
Nov = 11
Dec = 12
}
##
## create folder structure
##
New-Item -Path c:\ -Name Testdata -ItemType Directory
2018..2005 |
foreach {
New-Item -Path c:\Testdata -Name $psitem -ItemType Directory
$path = "c:\Testdata\$psitem"
1..12 |
foreach {
$name = "{0:00}-{1}" -f $psitem, [month]$psitem
New-Item -Path $path -Name $name -ItemType Directory
}
}
这给了我一个易于测试的结构。我假设您的年份文件夹是某些内容的子文件夹。如果它们在正常工作的驱动器的根目录中。
要删除文件夹:
enum month {
Jan = 1
Feb = 2
Mar = 3
Apr = 4
May = 5
Jun = 6
Jul = 7
Aug = 8
Sep = 9
Oct = 10
Nov = 11
Dec = 12
}
$date = Get-Date
$year = $date.Year - 8
##
## delete evreything 8 years or older
##
Get-ChildItem -Path C:\Testdata -Directory |
where Name -le $year |
foreach {
Remove-Item -Path $psitem.Fullname -Recurse -Force -Confirm:$false
}
##
## if Month -ne January
## need to delete some months
##
if ($date.Month -gt 1){
$path = "C:\testdata\$($year+1)"
$month = $date.Month -1
1..$month |
foreach {
$mpath = "$path\{0:00}-{1}" -f $psitem, [month]$psitem
Remove-Item -Path $mpath -Recurse -Force -Confirm:$false
}
}
我对您使用的三个字母缩写进行了假设,但是您可以轻松地更改枚举。
该代码获取当前日期,并减去-8。它循环遍历您的顶级文件夹,并获取小于或等于您定义的年份的文件夹。它们及其内容被强制删除。如果您将其中一个文件固定为打开,则唯一可以阻止删除的操作。
如果当前月份为一月,则无需执行其他操作。否则,请创建-7年文件夹的路径并计算要删除的最后一个月。循环浏览月份,构建路径并强制删除文件夹及其内容。
大部分工作在年度级别完成,并快速清理了几个月。我建议您进行几个月的测试,以检查逻辑是否符合您的需求。
答案 1 :(得分:0)
好的,这很简单,它将要求您进行一些编码并本质上使用嵌套循环。您需要了解的是如何使用Get-Date动词。因此,一个样本将在2011年之前递归删除所有数据,看起来像这样
# Set your Path
$MyFolderPath = "C:\MyPath"
# Define the object to hold the folders (We are only looking for Folders not files)
$folders = Get-Childitem -Path $MyFolderPath -Directory
# Loop through each folder
foreach($folder in $folders)
{
# Using a cast to integer compare the Year using the folder name with the
# Get-Date function -7 years from this year
if([int]$folder.Name -lt (Get-Date).AddYears(-7).Year)
{
# Now remove the entire folder recursively without prompting.
Remove-Item $folder.FullName -Recurse -Force -Confirm:$false
}
}
现在要达到月级水平。我将让您在嵌套循环中玩转并达到该级别。希望对您有帮助...