【问题标题】:Delete all file and keep the latest using powershell使用powershell删除所有文件并保持最新
【发布时间】:2021-01-19 11:51:53
【问题描述】:

我有一个每天备份的文件,示例如下:

在删除除最新之外的所有内容之前:

Folder C:\Backup\
File : 
Backup1-Database-A.bak | 1/10/2020 1:24 PM
Backup2-Database-A.bak | 2/10/2020 1:24 PM
Backup1-Database-B.bak | 1/10/2020 1:24 PM
Backup2-Database-B.bak | 2/10/2020 1:24 PM
Backup2-Database-B.bak | 3/10/2020 1:24 PM

删除除最新之外的所有内容后的所需状态:

Folder C:\Backup\
File : 
Backup2-Database-A.bak | 2/10/2020 1:24 PM
Backup2-Database-B.bak | 3/10/2020 1:24 PM

如何为每个数据库保留最新的文件?

我正在使用这个脚本,但它删除了所有.bak,所以数据库 A 的备份消失了,但我想为每个数据库保留最新的。

$mydays = (Get-Date).AddDays(-7)
$path = "C:\Backup\"
Get-Childitem -path $path -recurse -force | Where-Object { !$_.PSIsContainer -and $_.name -like "*.bak" -and $_.LastWriteTime -lt $mydays} | Remove-Item -Force

【问题讨论】:

  • 如果您只想要最后(一)天的价值,请尝试$mydays = (Get-Date).AddDays(-1)。
  • @jfrmilner 是的,我试过 -1 。但它会删除所有文件,而不是保留最新的文件,也许我在类似名称的脚本上错了
  • 而不是测试某个日期...只需按日期排序并仅保留最新的日期。 [咧嘴]
  • 顺便说一句,使用-Filter '*.bak' 比使用$_.name -like "*.bak" 更有效。如果您的 PowerShell 版本是 3.0 或更高版本,请使用开关 -File 而不是 !$_.PSIsContainer
  • @lass - 看起来 mklement0 在他的回答中使用Group-Object 命令涵盖了这一点。 [咧嘴]

标签: powershell file backup


【解决方案1】:

正如Lee_Daily 所建议的,与其使用时间窗口进行过滤,不如按上次写入时间对文件进行排序并删除除最新文件之外的所有文件更简单。

挑战在于确定哪些文件与同一数据库相关,因此应将其视为一个组,以便您在每个组中保留最新的备份。

下面的代码使用如下方法:

  • Group-Object cmdlet 允许您按指示数据库的文件名的共享部分对输入文件进行分组。

    • 将脚本块{ $_.Name -replace '^Backup\d+-' } 传递给Group-Object 使用基于正则表达式的-replace operator,通过删除'Backup<n>-' 前缀,使其按指示源数据库的共享名称部分对输入文件对象进行分组。
    • 例如,'Backup1-Database-A.bak' 和 'Backup2-Database-A.bak' 的结果都只是 'Database-A.bak',因此这两个文件被组合在一起。
  • 然后可以使用
    Sort-Object,按最后写入时间以降序对每个结果组中的文件进行排序。

  • 您可以使用 Select-Object -Skip 1 从输出中排除第一个(因此也是最近的)文件。

  • 生成的文件——除了每个数据库的最新文件之外的所有文件——然后可以发送到Remove-Item。

$path = 'C:\Backup'
Get-Childitem -Path $path -Recurse -Force -File -Filter *.bak | 
  Group-Object { $_.Name -replace '^Backup\d+-' } | 
    ForEach-Object { 
      $_.Group | Sort-Object LastWriteTime -Descending | Select-Object -Skip 1 |
        Remove-Item -Force -Whatif  
    }

注意:上面命令中的-WhatIf common parameter预览操作。一旦您确定该操作将执行您想要的操作,请删除 -WhatIf。

还要注意初始文件选择的简化:-File (PSv3+) 将输出限制为仅文件(不包括目录),-Filter *.bak 是一种按文件扩展名过滤的有效方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 2019-12-31
    相关资源
    最近更新 更多