我制作了一个关注
的PowerShell脚本$Now = Get-Date
$Days = "1"
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
$LastWrite = $Now.AddDays(-$Days)
$Files = Get-Childitem $TargetFolder -Include $Extension -Recurse | Where {$_.LastWriteTime -le "$LastWrite"}
foreach ($File in $Files)
{
if ($File -ne $NULL)
{
write-host "Deleting File $File" -ForegroundColor "DarkRed"
Remove-Item $File.FullName | out-null
}
else
{
Write-Host "No more files to delete!" -ForegroundColor "Green"
}
}
现在这是一个从目录中删除文件的简单脚本。
我的目录中的文件名称是这样的
adventure_Test-20150131-191938.bak
adventure_Test-20150131-152010.bak
adventure_Test-20150205-191938.bak
adventure_Test-20150205-195038.bak
ontherDatabase-20150205-191938.bak
ontherDatabase-20150205-195038.bak
现在您可以看到31th Jan 2015
中有两个文件,5th Feb 2015
中有两个文件。我想删除除了最后两个添加的所有文件,我们在文件名中有日期时间以区分
更新 我想为每个数据库备份留下两个最新的文件
答案 0 :(得分:1)
您可以使用以下方法:
$bakfiles = Get-ChildItem *.bak
$flist = @()
foreach($backup in $bakfiles) {
if ( $backup.name -match '(\w+)\-(\d{8}\-\d{6})\.bak') {
$dt = [DateTime]::ParseExact($matches[2],"yyyyMMdd-HHmmss",$null)
$o = [PSCustomObject]@{path=$backup.FullName;backupDate=$dt;dbName=$matches[1]}
$flist += ,$o
}
}
$grouped = $flist | Sort-Object -Property BackupDate | Group-Object dbname
foreach($bgroup in $grouped) {
for($i = 0; $i -lt $bgroup.count-2; $i++) {
Remove-Item $bgroup.group[$i].path -WhatIf
}
}
Fist我们迭代你目录中的所有.bak
个文件。
在每个文件中,我们检查文件名以确保其符合格式,并使用正则表达式提取数据库名称和备份日期。 [DateTime]::ParseExact
可用于创建日期对象,以便进行比较。所有这些属性都存储在PSCustomObject
中并添加到数组中,因为我们可以使用标准cmdlet对列表进行筛选,排序和分组。
一旦我们拥有了对象数组,我们就可以按备份日期排序,并将它们组合在一起。然后我们可以迭代这些组并删除除最后两个文件之外的所有文件,因为这些文件将是该数据库的最后一个文件。
如果您对脚本感到满意,可以删除WhatIf
cmdlet上的Remove-Item
参数,并删除文件,而不是显示要删除的内容。
答案 1 :(得分:1)
您的时间戳隐含在文件名和字符串可排序格式中,因此您不需要进行任何日期时间操作来查找最新的时间戳。获取按数据库分组的文件,然后为每个数据库按降序排序文件名,它们按时间顺序排列,最新的位于顶部。
$DBHash = @{}
$Retain = 2
$TargetFolder = "D:\DatabaseBackup"
$Extension = "*.bak"
Get-Childitem $TargetFolder -Include $Extension -Recurse |
Select Name,Fullname |
foreach { $DBHash[$_.Name.Split('-')[0]] += @($_) }
$DBHash.Values |
foreach {
$_ | sort -Descending |
Select -Skip $Retain |
foreach { Remove-Item $_.FullName }
}