PowerShell:在文件名中添加日期和时间

时间:2015-02-23 10:06:06

标签: powershell cmd cmdlets

我制作了一个关注

的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中有两个文件。我想删除除了最后两个添加的所有文件,我们在文件名中有日期时间以区分

更新 我想为每个数据库备份留下两个最新的文件

2 个答案:

答案 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 }
         }