Have you ever run into C:\ volumes reaching critical thresholds because certain applications or users filling up system drive, causing Windoze to run out of disk space and perform sluggishly? Well, you’re in luck:
# deleteLogsOlderThanXDays.ps1
# Version 0.0.1
# User defined variables
$logDirectories='C:\Temp'
$deleteLogsOlderThanDays=30
$testOnly=$false
$logFile='C:\purgedFiles.txt'
$renameLogGreaterThanMb=5
# Execute deletion
# Safety check
$hardStopLocations=@(
'C:\Windows',
'C:\ProgramData',
'C:\Users',
'C:\Program Files (x86)',
'C:\Program Files'
)
$ErrorActionPreference='ignore'
$today=Get-Date
$deletionMarker=$today.AddDays(-$deleteLogsOlderThanDays)
$deletedFiles="`r`nJob started $($today.DateTime.ToString())`r`n--------------------------------------------`r`n"
foreach($directory in $logDirectories){
$isSafe=.{
$parent=if(test-path $directory){
try{
(get-item $directory -EA Ignore).parent.FullName
}catch{
$null
}
}else{
write-warning "$directory cannot be parsed."
return $null
}
if($parent -eq $null){
write-warning "$directory is invalid"
return $false
}elseif($parent -in $hardStopLocations){
write-warning "$directory is not a safe location to manipulate files."
return $false
}else{
return $true
}
}
if($isSafe){
if($testOnly){
Get-ChildItem $directory -Recurse -EA Ignore|?{ $_.LastWriteTime -lt $deletionMarker }|%{write-host "Marked for deletion: $_"}
}else{
$itemsToDelete=Get-ChildItem $directory -Recurse -EA Ignore|?{$_.LastWriteTime -lt $deletionMarker}
if($itemsToDelete){
foreach ($item in $itemsToDelete){
try{
Remove-Item $item.fullname -ea stop
write-host "Deleted: $item"
$deletedFiles+="Deleted: $($item.Fullname) with lastWriteTime of $($item.LastWriteTime.toString())`r`n"
}catch{
write-warning $_
}
}
}else{
$comment="There are no item(s) to delete in $directory`r`n"
write-host $comment
$deletedFiles+=$comment
}
}
}
}
$deletedFiles+="--------------------------------------------`r`nJob ended $((get-date).DateTime.ToString())"
if(test-path $logFile){
$logFileInfo=get-item $logFile
if($logFileInfo.length/1MB -gt $renameLogGreaterThanMb){
$timeZoneName=[System.TimeZoneInfo]::Local.StandardName
$timeStampFileName=[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([datetime]::UtcNow,$timeZoneName).ToString('yyyy-MM-dd_HH-mm-ss')+'_'+[regex]::replace($timeZoneName,'([A-Z])\w+\s*', '$1')
$abbreviatedZoneName=if($timeZoneName -match ' '){[regex]::replace($timeZoneName,'([A-Z])\w+\s*', '$1')}else{$timeZoneName}
$timeStampFormat="yyyy-MM-dd_HH-mm-ss_$abbreviatedZoneName"
$timeStampFileName=[System.TimeZoneInfo]::ConvertTimeBySystemTimeZoneId([datetime]::UtcNow,$timeZoneName).ToString($timeStampFormat)
$newName=join-path $logFileInfo.DirectoryName $($logFileInfo.BaseName+"_$timeStampFileName"+$logFileInfo.Extension)
rename-item $logFile $newName
}
}
Add-Content $logFile $deletedFiles
write-host "Log has been written to $logFile"
Categories: