我刚刚接管了一台服务器,其中包含一个用于存储数据库备份的文件夹
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)