2016-01-20 135 views
0
Get-ChildItem –Path 「H:\backups」 –Recurse | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} | Remove-Item 

我有這個腳本可以刪除超過4天的文件。不過,我想控制它應該刪除X數量的文件+文件夾4天,也想獲得日誌,以便我以後看到它。 以下是腳本,好嗎?刪除X個文件X舊日--Powershell

$Now = Get-Date 
$Days = "4" 
$TargetFolder = "H:\backups" 
$LastWrite = $Now.AddDays(-$days) 
$Files = get-childitem $TargetFolder -include *.* -recurse -force 
    Where {$_.CreationTime -le "$LastWrite"} 
    foreach ($i in Get-ChildItem $TargetFolder -recurse) 
{ 
    if ($i.CreationTime -lt ($(Get-Date).AddDays(-10))) 
    { 
     Remove-Item $Files -recurse -force 
    } 
} 
    Write-Output $Files >> c:\delete.log 
+0

是它很好 - 你問它是否會起作用?您可以通過在測試目錄中使用測試文件測試腳本來找到自己的想法。 –

+0

沒有工作你有嗎?如何在下面的腳本中獲取哪些文件被刪除的輸出。 Get-ChildItem -Path「H:\ backups」-Recurse | Where-Object {$ _。CreationTime -lt(Get-Date).AddDays(-4)} |刪除項目 – jacksh

+1

在刪除文件之前輸出文件的名稱。 –

回答

0

我相信這會工作,使您可以通過一個路徑和天數你想保持作爲參數:

function RemoveOld($path, $filefilter, $daystokeep) 
{ 
    $findfiles = @(Get-ChildItem -Path $path -Include $filefilter) 
    $toRemove = $findfiles | Where-Object CreationTime -le (Get-Date).AddDays(-$daystokeep) 
    $toRemove >> c:\temp\delete.log 
    $toRemove | Remove-Item 
} 

RemoveOld -path "H:\backups\*" -filefilter "*" -daystokeep 4 

我還建議,而不是刪除舊的文件比給定的時間框架,刪除比最新的X數量的文件更舊的文件。通過這種方式,你總是會保留一些文件,而不會在所有文件被刪除的情況下結束,如果備份無法運行幾天。這可能是一個選項,具體取決於您的文件夾結構是如何設置的(修改filefilter參數,因此您不會刪除超過所需的值)。

function RemoveOlder($path, $filefilter, $filestokeep) 
{ 
    $findfiles = @(Get-ChildItem -Path $path -Include $filefilter) 
    if ($findfiles.Count -gt $filestokeep) { 
     $findfiles | Sort-Object LastWriteTime -Descending | Select-Object -Last ($findfiles.Count - $filestokeep) | Remove-Item 
    } 
} 

RemoveOlder -path "H:\backups\*" -filefilter "*" -filestokeep 4 
+0

嗨@justin它會保持只有4個文件+文件夾或新的基礎上修改日期? – jacksh

+0

@jacksh使用該代碼示例將保留基於修改日期('LastWriteTime')的最近四個文件並刪除那些較舊的文件。 – JustinStolle

0

在原來的命令,補充一點:

-Verbose 4>&1 | Out-File -FilePath D:\delete.log -Append 

4是詳細輸出所以這是重定向放牧到stdout 1,然後重定向既日誌文件。最後的命令是:

Get-ChildItem –Path 「H:\backups」 –Recurse ` 
| Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} ` 
| Remove-Item -Verbose 4>&1 | Out-File -FilePath C:\delete.log -Append 

更新:如果你想命令非交互運行,並繼續在錯誤等調度任務,添加額外的參數Remove-Item

Get-ChildItem –Path 「H:\backups」 –Recurse ` 
    | Where-Object{$_.CreationTime –lt (Get-Date).AddDays(-4)} ` 
    | Remove-Item -Verbose -Force -ErrorAction SilentlyContinue -Confirm:$false 4>&1 ` 
    | Out-File -FilePath C:\delete.log -Append 
+0

這個腳本是好的,但是當我運行它時不斷彈出並要求確認我們可以跳過我們需要從任務計劃程序 – jacksh

相關問題