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

PowerShell : add date and time in filename

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

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

您可以使用以下方法:

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

首先我们遍历您目录中的所有 .bak 文件。

我们检查其中的每一个文件名以确保其符合格式,并使用正则表达式提取数据库名称和备份日期。 [DateTime]::ParseExact 可用于创建比较容易比较的日期对象。所有这些属性都存储在 PSCustomObject 中并添加到数组中,因为我们随后可以使用标准 cmdlet 对列表进行筛选、排序和分组。

一旦我们有了对象数组,我们就可以按备份日期排序,并将它们组合在一起。然后我们可以迭代这些组并删除除最后 2 个文件之外的所有文件,因为这些将是该数据库的最后一个文件。

如果您对脚本满意,可以删除 Remove-Item cmdlet 上的 WhatIf 参数,文件将被删除,而不是显示将被删除的内容。

您的时间戳隐含在文件名中并采用字符串可排序格式,因此您实际上不需要进行任何日期时间操作即可找到最新的时间戳。获取按数据库分组的文件,然后为每个数据库按降序对文件名进行排序,它们将按时间顺序排列,最新的在顶部。

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