【问题标题】:PowerShell : add date and time in filenamePowerShell:在文件名中添加日期和时间
【发布时间】:2015-04-24 14:57:06
【问题描述】:

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

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

【问题讨论】:

  • 不清楚你想做什么。是否要保留目录中的两个最新文件?还是每天最新的两个?还是什么?
  • 我想留下两个最新的
  • @MikeWise 我更新了问题,请参阅
  • @Ancient 这没有回答 Mike Wise 的问题...从您列出的输入文件中,您想保留哪些?最新的两个、每天最新的还是全部?
  • 好的,现在我们在adventure_test备份中有两个不同的数据库有问题的文件名列表我想保留两个newset和ontherDatabase我想保留两个最新的不管当前日期我只想保存每个数据库的最新两条记录

标签: powershell cmd cmdlets


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

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 2020-11-14
      • 2011-07-22
      • 1970-01-01
      相关资源
      最近更新 更多