递归删除某些文件夹?

时间:2018-08-20 11:08:07

标签: powershell

我有一个看起来像这样的文件夹结构

-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

2 个答案:

答案 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
    }    
}

现在要达到月级水平。我将让您在嵌套循环中玩转并达到该级别。希望对您有帮助...