Add AD scripts and stage import instructions
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
107
scripts/Invoke-LogRotation.ps1
Normal file
107
scripts/Invoke-LogRotation.ps1
Normal file
@@ -0,0 +1,107 @@
|
||||
<#
|
||||
.SYNOPSIS
|
||||
Rotates and cleans up old log files.
|
||||
|
||||
.DESCRIPTION
|
||||
Removes transcript and log files older than the specified retention period.
|
||||
Designed to run as a scheduled task daily.
|
||||
|
||||
.PARAMETER RetentionDays
|
||||
Number of days to retain log files. Default is 30.
|
||||
|
||||
.PARAMETER LogPath
|
||||
Path to the logs directory. Default is C:\ClaudeTools\Logs.
|
||||
|
||||
.PARAMETER WhatIf
|
||||
Shows what would be deleted without actually deleting.
|
||||
|
||||
.EXAMPLE
|
||||
.\Invoke-LogRotation.ps1
|
||||
Removes logs older than 30 days.
|
||||
|
||||
.EXAMPLE
|
||||
.\Invoke-LogRotation.ps1 -RetentionDays 14 -WhatIf
|
||||
Shows what would be deleted with 14-day retention.
|
||||
|
||||
.NOTES
|
||||
Author: ClaudeTools Automation
|
||||
Version: 1.0
|
||||
#>
|
||||
|
||||
[CmdletBinding(SupportsShouldProcess)]
|
||||
param(
|
||||
[Parameter(Mandatory=$false)]
|
||||
[int]$RetentionDays = 30,
|
||||
|
||||
[Parameter(Mandatory=$false)]
|
||||
[string]$LogPath = "C:\ClaudeTools\Logs"
|
||||
)
|
||||
|
||||
$rotationLog = Join-Path $LogPath "rotation.log"
|
||||
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
||||
|
||||
function Write-Log {
|
||||
param([string]$Message)
|
||||
$logEntry = "[$timestamp] $Message"
|
||||
Add-Content -Path $rotationLog -Value $logEntry
|
||||
Write-Host $logEntry
|
||||
}
|
||||
|
||||
Write-Log "=== Log Rotation Started ==="
|
||||
Write-Log "Retention Period: $RetentionDays days"
|
||||
Write-Log "Log Path: $LogPath"
|
||||
|
||||
$cutoffDate = (Get-Date).AddDays(-$RetentionDays)
|
||||
$totalDeleted = 0
|
||||
$totalSizeFreed = 0
|
||||
|
||||
# Find and delete old files
|
||||
$oldFiles = Get-ChildItem -Path $LogPath -Recurse -File |
|
||||
Where-Object { $_.LastWriteTime -lt $cutoffDate -and $_.Name -ne "rotation.log" }
|
||||
|
||||
$fileCount = ($oldFiles | Measure-Object).Count
|
||||
Write-Log "Found $fileCount files older than $RetentionDays days"
|
||||
|
||||
foreach ($file in $oldFiles) {
|
||||
$fileSize = $file.Length
|
||||
$filePath = $file.FullName
|
||||
|
||||
if ($PSCmdlet.ShouldProcess($filePath, "Delete")) {
|
||||
try {
|
||||
Remove-Item $filePath -Force
|
||||
$totalDeleted++
|
||||
$totalSizeFreed += $fileSize
|
||||
Write-Log "Deleted: $filePath ($([math]::Round($fileSize/1KB, 2)) KB)"
|
||||
} catch {
|
||||
Write-Log "ERROR deleting $filePath : $_"
|
||||
}
|
||||
} else {
|
||||
Write-Log "WhatIf: Would delete $filePath ($([math]::Round($fileSize/1KB, 2)) KB)"
|
||||
}
|
||||
}
|
||||
|
||||
# Delete empty subdirectories
|
||||
$emptyDirs = Get-ChildItem -Path $LogPath -Directory -Recurse |
|
||||
Where-Object { (Get-ChildItem $_.FullName -Force).Count -eq 0 }
|
||||
|
||||
foreach ($dir in $emptyDirs) {
|
||||
if ($PSCmdlet.ShouldProcess($dir.FullName, "Remove empty directory")) {
|
||||
try {
|
||||
Remove-Item $dir.FullName -Force
|
||||
Write-Log "Removed empty directory: $($dir.FullName)"
|
||||
} catch {
|
||||
Write-Log "ERROR removing directory $($dir.FullName) : $_"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Summary
|
||||
$sizeMB = [math]::Round($totalSizeFreed / 1MB, 2)
|
||||
Write-Log "=== Rotation Complete ==="
|
||||
Write-Log "Files Deleted: $totalDeleted"
|
||||
Write-Log "Space Freed: $sizeMB MB"
|
||||
|
||||
# Show current disk usage
|
||||
$currentSize = (Get-ChildItem -Path $LogPath -Recurse -File | Measure-Object -Property Length -Sum).Sum
|
||||
$currentSizeMB = [math]::Round($currentSize / 1MB, 2)
|
||||
Write-Log "Current Log Directory Size: $currentSizeMB MB"
|
||||
Reference in New Issue
Block a user