2017-04-15 81 views
2

有COTS應用程序,我們有創建報告,永不刪除它。所以我們需要開始清理它。我開始做一個foreach,當它達到50萬個文件時,服務器(36GB)的內存就會耗盡。搜索後,似乎你可以這樣改變它刪除大量的文件,而不會用完內存

Get-ChildItem -path $Path -recurse | foreach { 

它不會經過內存,但一次處理每個項目。在內存不足之前,我可以獲得1.4億個文件。

Clear-Host 
#Set Age to look for 
$TimeLimit = (Get-Date).AddMonths(-4) 
$Path = "D:\CC\LocalStorage" 

$TotalFileCount = 0 
$TotalDeletedCount = 0 

Get-ChildItem -Path $Path -Recurse | foreach { 
    if ($_.LastWriteTime -le $TimeLimit) { 
     $TotalDeletedCount += 1 
     $_.Delete() 
    } 
    $TotalFileCount += 1 

    $FileDiv = $TotalFileCount % 10000 
    if ($FileDiv -eq 0 -and $TotalFileCount -ne 0) { 
     $TF = [string]::Format('{0:N0}', $TotalFileCount) 
     $TD = [string]::Format('{0:N0}', $TotalDeletedCount) 
     Write-Host "Files Scanned : " -ForegroundColor Green -NoNewline 
     Write-Host "$TF" -ForegroundColor Yellow -NoNewline 
     Write-Host " Deleted: " -ForegroundColor Green -NoNewline 
     Write-Host "$TD" -ForegroundColor Yellow 
    } 

有沒有更好的方法來做到這一點?我唯一的想法不是使用-Recurse命令,而是自己爲每個目錄調用它自己的函數。

編輯:

我用的第一個答案提供的代碼,並沒有解決問題。內存仍在增長。

$limit = (Get-Date).Date.AddMonths(-3) 
$totalcount = 0 
$deletecount = 0 
$Path = "D:\CC\" 

Get-ChildItem -Path $Path -Recurse -File | Where-Object { $_.LastWriteTime -lt $limit } | Remove-Item -Force 
+0

如果目標是自動化,則寫入主機應更改爲Write-Verbose。請參閱http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ – lit

+0

這是一件特定的任務。我得到了Write-Verbose的目的,但因爲它只是我用它來獲取快速信息,所以很好。 – Jasin

回答

3

使用ForEach-Object和管道實際上應該防止代碼耗盡內存。如果你仍然遇到OOM異常,我懷疑你在代碼中做了一些反擊這個效果的東西,這是你沒有告訴我們的。

雖這麼說,你應該能夠清理你的數據目錄中是這樣的:

$limit = (Get-Date).Date.AddMonths(-4) 

Get-ChildItem -Path $Path -Recurse -File | 
    Where-Object { $_.LastWriteTime -lt $limit } | 
    Remove-Item -Force -WhatIf 

取出-WhatIf開關你確認一切正常後。

如果您需要在總文件數和刪除的文件的數量,添加計數器這樣的:

$totalcount = 0 
$deletecount = 0 

Get-ChildItem -Path $Path -Recurse -File | 
    ForEach-Object { $totalcount++; $_ } | 
    Where-Object { $_.LastWriteTime -lt $limit } | 
    ForEach-Object { $deletecount++; $_ } | 
    Remove-Item -Force -WhatIf 

我不建議打印狀態信息發送到控制檯當你批量處理大量的文件。輸出可能會顯着減慢處理速度。如果您必須擁有該信息,請將其寫入日誌文件並分別尾隨該文件。

+0

該功能與我擁有的功能完全相同。我只是刪除了我發佈的函數前後的消息。至於輸出,我同意這會減慢處理速度,這就是爲什麼我每10000次纔會這樣做,但這只是爲了讓我留意它在OOM死亡之前的位置。 我會盡快測試你的代碼。由於有這麼多的文件,將會一直持續到明天,但是謝謝你。 – Jasin

+0

好的,所以我用第一個腳本沒有任何修改,它仍然吃了內存。在使用全部36 GB RAM之前,我無法運行整個文件夾 – Jasin

+0

無法重現。我用1,000,000個隨機生成的文件測試了上述代碼,並且內存消耗沒有顯着增加。 –