2015-02-23 48 views
0

我做這是繼的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" 
    } 
} 

現在,這是一個簡單的腳本從目錄中刪除文件PowerShell腳本。

我在我的目錄中的文件,像這樣

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

目前尚不清楚你想要做什麼。你想離開目錄中的兩個最新的文件嗎?或者每天最新的兩個?或者是什麼? – 2015-02-23 10:08:37

+0

我要離開兩個最新 – Ancient 2015-02-23 10:09:33

+0

@MikeWise我更新的問題,請參見 – Ancient 2015-02-23 10:12:13

回答

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 } 
     } 
+0

完美!!!!向你致敬 。非常感謝 – Ancient 2015-02-23 12:17:44

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可以用來創建日期對象,這將是eaiser比較。所有這些屬性都存儲在PSCustomObject中,並添加到數組中,因爲我們可以使用標準cmdlet對列表進行過濾,分類和分組。

一旦我們有了對象數組,我們可以按備份日期排序,並將它們組合在一起。然後,我們可以迭代這些組並刪除除最後2個文件以外的所有文件,因爲這些文件將是該數據庫的最後一個文件。

如果您對該腳本感到滿意,則可以刪除Remove-Item cmdlet上的參數WhatIf,這些文件將被刪除而不是顯示將被刪除的內容。