有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
如果目標是自動化,則寫入主機應更改爲Write-Verbose。請參閱http://www.jsnover.com/blog/2013/12/07/write-host-considered-harmful/ – lit
這是一件特定的任務。我得到了Write-Verbose的目的,但因爲它只是我用它來獲取快速信息,所以很好。 – Jasin