【问题标题】:Powershell: Deleting old backup files but leave the recent one even if it's olderPowershell:删除旧的备份文件,但保留最近的备份文件,即使它较旧
【发布时间】:2021-07-19 14:11:42
【问题描述】:

我正在尝试编写一个 .ps1 脚本来删除超过 2 天的文件,但如果旧文件也保留最新的文件。
对于删除部分,互联网上充满了要复制/粘贴的代码的 sn-p。
对于“留下最近的文件”,我很麻烦。

bk的文件夹结构如下:
--Db.yyyy.MM.dd.Native.bak.zip
--文件.yyyy.MM.dd.zip
--Log.yyyy.MM.dd.txt
-- 以此类推旧文件

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

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

感谢所有人。

附:我是第一次使用 powershell,我必须做这个脚本才能工作。

【问题讨论】:

  • 至于这个...Is the first time i use powershell and i have to do this script for work.。那么最好先进行一些加速。在 Youtube 上搜索 Beginning PowerShellPowerShell file and folder Management。这是任何 PowerShell 课程/网络研讨会/研讨会/书籍等的第一天。从字面上看,您所追求的所有内容都在 PowerShell 帮助文件中,Get-Help 解释和示例。请参阅 Get-ChildItemSort-Object cmdlet。按日期排序,保留前 3 个,删除其余的。
  • 简单的风险管理规则:1. 如果您不了解代码在做什么,或者愿意完全接受结果,则永远不要运行任何人的代码。无论您从哪里或从谁那里得到它。特别是如果您可以访问源代码),除非您愿意接受运行它的所有后果。 2. 永远不要在没有完全检查结果之前运行破坏性代码(添加/创建/更新、移动/删除/修改等)。掌握WhatIf/Confirm/Trace-Command/Invoke-ScriptAnalyzer的使用。 3。在您首先验证之前,所有输入都是邪恶的,无论它来自哪里。测试实验室。

标签: powershell scheduled-tasks backup dotnetnuke


【解决方案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
}

【讨论】:

  • 另外,排序只是为了让它工作,因为 Powershell 默认对 AZ 中的文件名进行排序,所以它不需要在第一次运行后重新分配旧文件名 :) 你可以删除排序。或者,如果可以的话,只查看目录中最旧的文件,如果备份文件是用修改的日期写入的,解析会很慢并且在这种情况下可能无用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
相关资源
最近更新 更多