2017-08-08 96 views
0

保留策略是“保留最近7次备份(上周),然后保留星期五备份3个月,然后保持每月上个星期五备份一年”。根据自定义日期过滤器删除旧文件

以下是涵盖两个保留条件的脚本,但无法完成第三个条件,即“每个月的上个星期五备份一年”。需要帮助使IF块相同。

编辑:解决方案将文件移动到不同的文件夹中,然后将单独的保留脚本应用到单独的文件夹将不可能,因为里面有很多子文件夹。由于这全部用于备份文件,因此移动文件会使我们的依赖恢复过程更加复杂,否则代码将需要在所有服务器上进行调整。

#----- define folder where files are located ----# 
$TargetFolder = "C:\Users\chsa\Desktop\Retention" 

#----- define extension ----# 
$Extension = "*.txt" 

#----- define LastWriteTime parameter based on $Days ---# 
$LastWrite = $Now.AddDays(-$Days) 

#----- get files based on lastwrite filter and specified folder ---# 
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL -and $File.LastWriteTime -lt (Get-Date).AddYears(-1)) 
    { 
    Remove-Item $File.FullName | Out-Null 
    Write-Host $File 
    } 

    if ($File -ne $NULL -and $File.LastWriteTime -ge (Get-Date).AddMonths(-3) -and $File.LastWriteTime -lt (Get-Date).AddDays(-7) -and $File.LastWriteTime.DayOfWeek -ne "Friday") 
    { 
    Remove-Item $File.FullName | Out-Null 
    Write-Host $File 
    } 
} 
+0

'“$ LastWrite”' - >'$ LastWrite' –

+0

作为实现您的保留策略:移动备份()你想清理之前保留到不同的文件夹,即移动从周五备份将“每日”文件夹设置为“每周”文件夹并带有单独的清理任务。为每月备份做同样的事情。 –

+0

谢谢Ansgar,但这是不可能的,因为有很多子文件夹,以这种方式设置可能会有风险。 –

回答

0

下面的最终脚本。

该解决方案并不理想,因为该脚本使用了多个循环,这听起来没有必要,但是需求似乎已经完成;并且脚本测试正常。

此外,该脚本还有其他规定,如果以防万一,Last-Friday-Of-Month的备份文件不可用,那么该脚本将保留第二个最后一个星期五的备份文件。同样的道理,如果倒数第二也不可用,那么它将保持倒数第三;第四周和第五周相同。非常感谢你们所有人。

#----- calculate start and end of current month ----# 
$startofmonth = Get-Date -day 1 -hour 0 -minute 0 -second 0 
$endofmonth = (($startofmonth).AddMonths(1).AddSeconds(-1)) 

#----- define folder where files are located ----# 
$TargetFolder = "C:\Users\chsa\Desktop\Retention" 

#----- define extension ----# 
$Extension = "*.txt" 

#----- get files based on lastwrite filter and specified folder ---# 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -lt $startofmonth.AddMonths(-13) } 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-13) -and $_.LastWriteTime -le $endofmonth.AddMonths(-13) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-13) -and $_.LastWriteTime -le $endofmonth.AddMonths(-13) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-12) -and $_.LastWriteTime -le $endofmonth.AddMonths(-12) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-12) -and $_.LastWriteTime -le $endofmonth.AddMonths(-12) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-11) -and $_.LastWriteTime -le $endofmonth.AddMonths(-11) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-11) -and $_.LastWriteTime -le $endofmonth.AddMonths(-11) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-10) -and $_.LastWriteTime -le $endofmonth.AddMonths(-10) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-10) -and $_.LastWriteTime -le $endofmonth.AddMonths(-10) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-9) -and $_.LastWriteTime -le $endofmonth.AddMonths(-9) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-9) -and $_.LastWriteTime -le $endofmonth.AddMonths(-9) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-8) -and $_.LastWriteTime -le $endofmonth.AddMonths(-8) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-8) -and $_.LastWriteTime -le $endofmonth.AddMonths(-8) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-7) -and $_.LastWriteTime -le $endofmonth.AddMonths(-7) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-7) -and $_.LastWriteTime -le $endofmonth.AddMonths(-7) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-6) -and $_.LastWriteTime -le $endofmonth.AddMonths(-6) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-6) -and $_.LastWriteTime -le $endofmonth.AddMonths(-6) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-5) -and $_.LastWriteTime -le $endofmonth.AddMonths(-5) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-5) -and $_.LastWriteTime -le $endofmonth.AddMonths(-5) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-4) -and $_.LastWriteTime -le $endofmonth.AddMonths(-4) -and $_.LastWriteTime.DayofWeek -eq "Friday"} | Sort LastWriteTime -Desc | Select -Skip 1 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-4) -and $_.LastWriteTime -le $endofmonth.AddMonths(-4) -and $_.LastWriteTime.DayofWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-3) -and $_.LastWriteTime -le $endofmonth.AddMonths(-3) -and $_.LastWriteTime.DayOfWeek -ne "Friday"} 


foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-2) -and $_.LastWriteTime -le $endofmonth.AddMonths(-2) -and $_.LastWriteTime.DayOfWeek -ne "Friday"} 


foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth.AddMonths(-1) -and $_.LastWriteTime -le $endofmonth.AddMonths(-1) -and $_.LastWriteTime.DayOfWeek -ne "Friday"} 


foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 

$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | where {$_.LastWriteTime -ge $startofmonth -and $_.LastWriteTime -lt (Get-Date).AddDays(-8) -and $_.LastWriteTime.DayOfWeek -ne "Friday"} 

foreach ($File in $Files) 
{ 
    if ($File -ne $NULL) 
    { 
    Remove-Item $File.FullName | out-null 
    #write-host $File 
    } 

} 
+0

脚本部署在生产中并按预期工作。谢谢你们。 –

0

会添加评论,但我没有它的声誉。

首先,我定义了一个函数来获得“Last of Friday of month”片段,这似乎不可能在没有混乱的混乱的情况下在单行上完成。

function LastFridayOfMonth([DateTime] $DateIn) 
{ 
    $numDaysArr = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
    return ($numDaysArr[$DateIn.Month] - $DateIn.Day) -lt 7 -and $DateIn.DayOfWeek -eq [System.DayOfWeek]::Friday 
} 

然后,它是容易,我认为这与逻辑倒置,DeMorgans定理或许可以简化逻辑在我的if语句,但它应该工作。

if (-not ($file.LastWriteTime -lt (Get-Date).AddYears(-1) -and $file.LastWriteTime -gt (Get-Date).AddMonths(-3) -and (LastFridayOfMonth $file.LastWriteTime))) 
{ 
    Remove-Item $File.FullName | Out-Null 
    Write-Host $File 
} 

注意,它不考虑闰年,我只测试了LastFridayOfMonth功能,而不是if语句的逻辑。在开始删除文件之前检查它...尽管如此,总体思路仍然适合您。