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

时间:2021-04-26 07:43:06

标签: powershell scheduled-tasks backup dotnetnuke

我正在尝试编写一个 .ps1 脚本来删除超过 2 天的文件,但如果旧的文件也保留最新的文件。
对于删除部分,互联网上充满了要复制/粘贴的代码片段。< br/> 对于“保留最近的文件”,我感到很不安。

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

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

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

感谢所有人。

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

1 个答案:

答案 0 :(得分:1)

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

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

#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
}