Powershell:删除旧备份文件但保留最近的备份文件,即使它较旧

Powershell: Deleting old backup files but leave the recent one even if it's older

我正在尝试编写一个 .ps1 脚本来删除超过 2 天的文件,但如果旧文件也保留最新的文件。
对于删除部分,互联网上充满了代码copy/paste.
片段 为了 "leave recent files" 我陷入了困境。

bk文件夹的结构如下:
--Db.yyyy.MM.dd.Native.bak.zip
--Files.yyyy.MM.dd.zip
--Log.yyyy.MM.dd.txt
--等等旧文件

如果超过 2 天,我也想保留最近的三个文件。

如果有人对正确的方法或解决方案有任何建议,我会在这里学习。

谢谢大家。

P.S。这是我第一次使用 powershell,我必须执行此脚本才能工作。

我想让你开始,这样你就会知道如何处理这个问题。如果您从逻辑上处理它,实际上并不太难。首先,您需要从备份文件夹中获取正确的文件。然后你必须通过解析文件名来检查每个文件。

我想知道你是否不能只取文件日期并按最早的排序?但是如果你真的需要去掉文件名,我写了一个非常粗略的脚本来说明这种方法的外观。请记住,我只是做了一些快速而肮脏的替换以使其工作:

#Get files 
$zipFilesInFolder = Get-Childitem –Path "C:\Temp" | Where-Object {!$_.PSIsContainer -and  ($_.Name -like "*Files*") } | Sort-Object  -Property Name -Descending
Write-Host 'Files found:' $zipFilesInFolder

# Check files found
[datetime]$oldestDate = Get-Date;
[string]$oldestFile;

# Check each file by parsing the filename
Foreach ($i in $zipFilesInFolder) {
  $fileDate = $i -replace 'Files.' -replace '.zip',''
  $parsedDate = [datetime]::parseexact($fileDate, 'yyyy-MM-dd', $null)
  #If we find an older file then the one we currently have in memory, re-assign
  if($parsedDate -lt $oldestDate) {
    Write-Host 'Older file found than:' $oldestDate ', oldest is now: ' $i
    $oldestDate = $parsedDate;
    $oldestFile = $i;
  }
}

# Display and copy
Write-Host 'Oldest file found:' $oldestFile

我创建了一个目录:C:\Temp,其中包含以下文件: Files.2021-04-21.zip 到 Files.2021-04-26.zip

输出如下所示:

Files found: Files.2021-04-26.zip Files.2021-04-25.zip Files.2021-04-23.zip Files.2021-04-22.zip Files.2021-04-21.zip Files.2021-04-21.zip

Older file found than: 26-4-2021 10:17:01 , oldest is now:  Files.2021-04-26.zip
Older file found than: 26-4-2021 00:00:00 , oldest is now:  Files.2021-04-25.zip
Older file found than: 25-4-2021 00:00:00 , oldest is now:  Files.2021-04-23.zip
Older file found than: 23-4-2021 00:00:00 , oldest is now:  Files.2021-04-22.zip
Older file found than: 22-4-2021 00:00:00 , oldest is now:  Files.2021-04-21.zip
Oldest file found:  Files.2021-04-21.zip

这应该足以完成您的作业:)祝您好运!

再次强调,您最好查看文件的修改日期而不是文件名。

既然如此,就这样做

# Get files 
$zipFilesInFolder = Get-Childitem –Path "C:\Temp" | Where-Object {!$_.PSIsContainer -and  ($_.Name -like "*Files*") } | Sort-Object  -Property LastWriteTime -Descending
Write-Host 'Files found:' $zipFilesInFolder

# Check each file
Foreach ($i in $zipFilesInFolder) {
  $i # Shows files from top to bottom, based on last modified date
}