Bird
Raised Fist0
PowerShellscripting~10 mins

Log cleanup automation in PowerShell - Step-by-Step Execution

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Concept Flow - Log cleanup automation
Start script
Set log folder path
Get list of log files
For each file
Check file age > threshold?
NoSkip file
Yes
Delete file
Repeat for next file
End script
The script starts by setting the folder path, then checks each log file's age. If older than the set days, it deletes the file, repeating until all files are processed.
Execution Sample
PowerShell
 $logPath = "C:\Logs"
 $days = 7
 Get-ChildItem $logPath -Filter *.log | ForEach-Object {
   if (((Get-Date) - $_.LastWriteTime).Days -gt $days) {
     Remove-Item $_.FullName
   }
 }
This script deletes .log files older than 7 days in the C:\Logs folder.
Execution Table
StepActionFile ProcessedFile Age (days)Condition (Age > 7)Result
1Get list of .log filesN/AN/AN/AFiles found: app.log, error.log, old.log
2Check app.logapp.log33 > 7? FalseSkip file
3Check error.logerror.log1010 > 7? TrueDelete file
4Check old.logold.log1515 > 7? TrueDelete file
5End of filesN/AN/AN/AScript ends
💡 All files processed; script ends after checking all files.
Variable Tracker
VariableStartAfter Step 1After Step 2After Step 3After Step 4Final
$logPath"C:\Logs""C:\Logs""C:\Logs""C:\Logs""C:\Logs""C:\Logs"
$days777777
Current FileN/Aapp.logerror.logold.logN/AN/A
File AgeN/A31015N/AN/A
Files Deleted001222
Key Moments - 3 Insights
Why does the script skip some files instead of deleting them?
Files are skipped if their age in days is not greater than the threshold (7 days). See execution_table rows 2 and 3 where app.log is skipped because 3 > 7 is False.
How does the script determine the file's age?
The script subtracts the file's LastWriteTime from the current date and checks the Days property. This is shown in execution_table column 'File Age (days)'.
What happens if there are no log files in the folder?
The script gets an empty list and ends immediately after step 1 with no files processed, as implied by the exit_note.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, what is the file age of error.log at step 3?
A10 days
B3 days
C15 days
D7 days
💡 Hint
Check the 'File Age (days)' column in execution_table row 3.
At which step does the script delete the first file?
AStep 4
BStep 2
CStep 3
DStep 1
💡 Hint
Look at the 'Result' column in execution_table to see when 'Delete file' first appears.
If the $days variable was changed to 2, what would happen to app.log at step 2?
AIt would be skipped
BIt would be deleted
CScript would error
DIt would be renamed
💡 Hint
Compare the file age (3 days) to the new threshold (2 days) using the condition in execution_table.
Concept Snapshot
Log cleanup automation in PowerShell:
- Use Get-ChildItem to list log files
- Check each file's LastWriteTime against current date
- Delete files older than a set number of days
- Loop through all files
- Script ends after all files checked
Full Transcript
This PowerShell script automates cleaning up log files by deleting those older than a specified number of days. It starts by setting the folder path and the age threshold. Then it lists all .log files in the folder. For each file, it calculates the age by subtracting the file's last write time from the current date. If the file is older than the threshold, it deletes the file; otherwise, it skips it. This process repeats until all files are checked, then the script ends.

Practice

(1/5)
1. What is the main purpose of automating log cleanup using PowerShell scripts?
easy
A. To delete old log files and free up disk space
B. To create new log files automatically
C. To rename log files for better organization
D. To compress log files for faster access

Solution

  1. Step 1: Understand log cleanup goal

    The goal is to remove old log files that are no longer needed to save disk space.
  2. Step 2: Identify automation benefit

    Automating this process ensures logs are cleaned regularly without manual effort.
  3. Final Answer:

    To delete old log files and free up disk space -> Option A
  4. Quick Check:

    Log cleanup = delete old logs [OK]
Hint: Log cleanup means removing old logs to save space [OK]
Common Mistakes:
  • Confusing cleanup with creating or renaming logs
  • Thinking cleanup compresses files instead of deleting
  • Assuming automation creates logs automatically
2. Which PowerShell command correctly lists log files older than 30 days in the folder C:\Logs?
easy
A. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(30) }
B. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-30) }
C. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) }
D. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.CreationTime -lt (Get-Date).AddDays(30) }

Solution

  1. Step 1: Identify correct date filter

    We want files older than 30 days, so LastWriteTime should be less than (Get-Date).AddDays(-30).
  2. Step 2: Check command syntax

    Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } uses LastWriteTime -lt (less than) 30 days ago, correctly filtering old files.
  3. Final Answer:

    Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } -> Option C
  4. Quick Check:

    Older than 30 days = LastWriteTime -lt (Get-Date).AddDays(-30) [OK]
Hint: Use -lt (less than) with AddDays(-30) for files older than 30 days [OK]
Common Mistakes:
  • Using -gt instead of -lt for older files
  • Filtering by CreationTime instead of LastWriteTime
  • Using AddDays(30) instead of AddDays(-30)
3. What will be the output of this PowerShell script?
Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } | Remove-Item -WhatIf
medium
A. Throws an error because Remove-Item cannot be piped
B. Lists all .log files older than 7 days and deletes them
C. Deletes all .log files regardless of age
D. Shows which .log files older than 7 days would be deleted without deleting

Solution

  1. Step 1: Understand the pipeline

    The script finds .log files older than 7 days using Get-ChildItem and Where-Object.
  2. Step 2: Analyze Remove-Item with -WhatIf

    -WhatIf shows what would happen without deleting files, so no files are removed.
  3. Final Answer:

    Shows which .log files older than 7 days would be deleted without deleting -> Option D
  4. Quick Check:

    -WhatIf shows actions without executing [OK]
Hint: Remove-Item -WhatIf previews deletion without removing files [OK]
Common Mistakes:
  • Thinking files are deleted with -WhatIf
  • Assuming Remove-Item cannot be piped
  • Confusing filter for files newer than 7 days
4. Identify the error in this PowerShell script intended to delete log files older than 15 days:
Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-15) } | Remove-Item
medium
A. The filter uses -gt instead of -lt, so it deletes newer files
B. Remove-Item cannot be used in a pipeline
C. Get-ChildItem does not support -Filter parameter
D. The script is missing the -Recurse flag

Solution

  1. Step 1: Check the date comparison operator

    -gt means greater than, so it selects files newer than 15 days, opposite of intended.
  2. Step 2: Confirm correct operator for old files

    To delete files older than 15 days, use -lt (less than) with AddDays(-15).
  3. Final Answer:

    The filter uses -gt instead of -lt, so it deletes newer files -> Option A
  4. Quick Check:

    Older files need -lt, not -gt [OK]
Hint: Use -lt for files older than a date, not -gt [OK]
Common Mistakes:
  • Using -gt instead of -lt for filtering old files
  • Thinking Remove-Item can't be piped
  • Assuming -Filter is unsupported by Get-ChildItem
5. You want to automate deleting log files older than 10 days from C:\Logs and log the deleted filenames to deleted_logs.txt. Which script correctly does this?
hard
A. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -gt (Get-Date).AddDays(-10) } | Remove-Item; Out-File -FilePath 'deleted_logs.txt' -InputObject 'Deleted logs' -Append
B. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-10) } | ForEach-Object { Remove-Item $_.FullName; $_.FullName | Out-File -FilePath 'deleted_logs.txt' -Append }
C. Remove-Item -Path 'C:\Logs\*.log' -Recurse -Force; Get-ChildItem 'deleted_logs.txt' | Out-File -FilePath 'deleted_logs.txt' -Append
D. Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Remove-Item; Add-Content -Path 'deleted_logs.txt' -Value 'Logs deleted'

Solution

  1. Step 1: Filter files older than 10 days

    Use Where-Object with LastWriteTime -lt (Get-Date).AddDays(-10) to select old logs.
  2. Step 2: Remove files and log names

    ForEach-Object removes each file and appends its name to deleted_logs.txt using Out-File -Append.
  3. Final Answer:

    Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-10) } | ForEach-Object { Remove-Item $_.FullName; $_.FullName | Out-File -FilePath 'deleted_logs.txt' -Append } -> Option B
  4. Quick Check:

    Filter old files + remove + log names = Get-ChildItem -Path 'C:\Logs' -Filter '*.log' | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-10) } | ForEach-Object { Remove-Item $_.FullName; $_.FullName | Out-File -FilePath 'deleted_logs.txt' -Append } [OK]
Hint: Use ForEach-Object to remove and log each file name [OK]
Common Mistakes:
  • Filtering with -gt instead of -lt
  • Logging only a fixed string, not filenames
  • Deleting files without logging
  • Using Remove-Item without filtering