使用 Powershell 根据文件夹名称、日期(年份和月份)和时间戳删除文件

使用 Powershell 根据文件夹名称、日期(年份和月份)和时间戳删除文件

我刚刚接管了一台服务器,其中包含一个用于存储数据库备份的文件夹

D:\备份

这里有名为 2019、2020、2021 的文件夹。这些文件夹中还有按月份命名的文件夹,名为一月、二月、三月等,其中还有按天数 01、02 到 31 的文件夹。

每个文件夹中包含一天的 3 个数据库备份 dbname_timestamp.bak

理想情况下,我希望实现的是,对于 2021 年或以后的任何内容(2022、2023 等),我们都会找到上个月的文件夹(因此今天,我们将导航到 D:\Backups\2021\August)并删除除 01 和 15 之外的所有文件夹。

然后,在文件夹 01 和 15 中,我们只保留该文件夹中最早的文件。因此,我们将从每个文件夹中删除 2 个 bak 文件。

在 2021 年之前,没有一个有组织的解决方案来保存备份,因此 2021 年之前的任何内容都有点混乱,并且无法使用此解决方案。我们需要保留当前 2019 年和 2020 年文件夹中的所有数据。

我的问题是(请问),有没有办法让 Powershell 能够计算出它需要在 2021 文件夹(当前年份)中查找,然后在 8 月文件夹(上个月)中查找。

我是 powershell 的新手,目前发现这有点难以完善。我非常乐意自己编写代码(我不是要求免费脚本),我只是需要帮助,了解将操作系统上的当前日期/时间转换为此 Powershell 代码的最佳方法。

任何想法或建议都将不胜感激。Stevie

答案1

您可以使用以下方式获取月份的全名Get-Date。此脚本应该适用于您描述的文件夹结构,但请确保所有路径都正确:

# Assumes folder structure is (for example): D:\Backups\2021\September\27\file.txt

# Find the folder for the previous month (MMMM denotes long month name):
$year = (Get-Date).AddMonths(-1).Year
$MonthName = (Get-Date).AddMonths(-1) | Get-Date -Format 'MMMM'

# Get a list of all the daily folders for last month
$Dailies = Get-ChildItem -Directory -Path "D:\Backups\$Year\$MonthName"

# Delete all but two of the daily folders:
Foreach ($day in $Dailies) {
  # Keep backups from the 1st and 15th
  If ($day.name -notin '01','15') {
    Remove-Item $day.FullName -Recurse -WhatIf
  }
  # In 1st and 15th folders, only keep oldest file
  Else {
    Get-ChildItem $day.FullName | 
        Sort CreationTime | 
        Select -Skip 1 | 
        Remove-Item -WhatIf
  }
}

我还添加了,-WhatIf以便您可以安全地尝试它而无需删除任何内容。


Get-Date使用当前的文化设置来获取月份名称,因此如果您有远程连接或使用与备份程序不同的语言,则可能需要指定要使用的文化:

$MonthName = [cultureinfo]::InvariantCulture.DateTimeFormat.GetMonthName((Get-Date).AddMonths(-1).Month)

相关内容