Script to delete files older than x-days. The script is built to be used as a scheduled task, it automatically generates a logfile name based on the copy location and the current date/time. There are various levels of logging available and the script can also run in -listonly mode in which it only lists the files it would otherwise delete. There are two main routines, one to delete the files and a second routine that checks if there are any empty folders left that could be deleted.

There are two logging levels available, failed only and verbose, which logs every file and folder that is deleted. 

 

Version 2.0.5 - Added new parameter

Version 2.0.4 - New functionality and optimalizations

Version 2.0.3 - Fixed minor bug

Version 2.0.2 - Fixed minor bug

Version 2.0.1 - Fixed minor bug

Version 2.0.0 - New parameter and rewrite of several parts of the script

Version 1.9.5 - Improved logging in certain scenarios

Version 1.9.4 - Improved behavior with square brackets in filename

Version 1.9.3 - Added new switch parameter

Version 1.9.2 - Behaviour of RegExPath changed, minor bugfix

Version 1.9.1 - Minor tweak, bugfix

Version 1.9 - Major Feature update and bug fixes

Version 1.8.5 - Error in examples

Version 1.8.4 - Bugfixes

Version 1.8.3 - Minor bugfix

Version 1.8.2 - Minor feature update

Version 1.8.1 - Minor bugfix

Version 1.8 - Added new functionality and resolved some issues

Version 1.7 - Added new functionality to -ExcludeDate and some fixes

Version 1.6.1 - Minor bugfix

Version 1.6 - Major Update :: Read notes Parameter names have been updated

Version 1.5.1 - Bugfixes

Version 1.5 - Added -Include parameter

Version 1.4 - Minor Update:

Version 1.3 - Update with multiple changes:

Version 1.2 - Update on request by Mike Allan:

Version 1.1 - Update:

Version 1.0 - Initial upload

 

 

PowerShell
Edit|Remove
<#    
.SYNOPSIS    
Script to delete or list old files in a folder 
     
.DESCRIPTION  
Script to delete files older than x-days. The script is built to be used as a scheduled task, it automatically generates a logfile name based on the copy location and the current date/time. There are various levels of logging available and the script can also run in -listonly mode in which it only lists the files it would otherwise delete. There are two main routines, one to delete the files and a second routine that checks if there are any empty folders left that could be deleted. 
     
.PARAMETER FolderPath  
The path that will be recusively scanned for old files. 
 
.PARAMETER Fileage 
Filter for age of file, entered in days. Use -1 for all files to be removed. 
     
.PARAMETER LogFile 
Specifies the full path and filename of the logfile. When the LogFile parameter is used in combination with -autolog only the path is required. 
 
.PARAMETER AutoLog 
Automatically generates filename at path specified in -logfile. If a filename is specified in the LogFile parameter and the AutoLog parameter is used only the path specified in LogFile is used. The file name is created with the following naming convention: 
"Autolog_<FolderPath><dd-MM-yyyy_HHmm.ss>.log" 
 
.PARAMETER ExcludePath 
Specifies a path or multiple paths in quotes separated by commas. The Exclude parameter only accepts full paths, relative paths should not be used. 
 
.PARAMETER IncludePath 
Specifies a path or multiple paths in quotes separated by commas. The Exclude parameter only accepts full paths, relative paths should not be used. IncludePath is processed before ExcludePath. 
 
.PARAMETER RegExPath 
This switch affects both the IncludePath and ExcludePath parameters. Instead of matching against a path name a regular expression is used. For more information about regular expressions see the help file: Get-Help about_Regular_Expressions. The regular expression is only matched against the path of a file, so no file names can be excluded by utilizing ExcludePath. 
 
.PARAMETER ExcludeFileExtension 
Specifies an extension or multiple extensions in quotes, separated by commas. The extensions will be excluded from deletion. Asterisk can be used as a wildcard. 
 
.PARAMETER IncludeFileExtension 
Specifies an extension or multiple extensions in quotes, separated by commas. The extensions will be included in the deletion, all other extensions will implicitly be excluded. Asterisk can be used as a wildcard. 
 
.PARAMETER KeepFile 
Specifies the number of files that should be retained in each folder. This can be useful if a folder should be cleaned but x-number of files should always be retained, the script will look at the parameter specified, LastWriteTime,CreationTime 
 
.PARAMETER EmailTo 
Should be used in conjunction with the EmailFrom and EmailSmtpServer parameters, this parameter can take an email address or an array of email address to whom the logfile will be emailed. 
 
.PARAMETER EmailFrom 
Should be used in conjunction with the EmailTo and EmailSmtpServer parameters, this parameter can take an email address which is set as the email address in the from field. 
 
.PARAMETER EmailSmtpServer 
Should be used in conjunction with the EmailTo and EmailFrom parameters, this parameter takes the fully qualified domain name of your smtp server. 
 
.PARAMETER EmailSubject 
Option email parameter, allows for setting a different subject for the email containing the log file. The default formatting of the subject is 'deleteold.ps1 started at: $StartTime FolderPath: $FolderPath' 
 
.PARAMETER ExcludeDate 
If the ExcludeDate parameter is specified the query is converted by the ConvertFrom-Query function. The output of that table is a hashtable that is splatted to the ConvertTo-DateObject function which returns an array of dates. All files that match a date in the returned array will be excluded from deletion. 
Query examples: 
Week: 
'Week,sat,-1' 
Will list all saturday until the LimitYear maximum is reached 
'Week,wed,5' 
Will list the last 5 wednesdays 
 
Month: 
'Month,first,4' 
Will list the first day of the last four months 
'Month,last,-1' 
Will list the last day of until the LimitYear maximum is reached. If the current date is the last day of the month the current day is also listed. 
'Month,30,3' 
Will list the 30th of the last three months, if february is in the results it will be ignored because it does not have 30 days. 
'Month,31,-1' 
Will only list the 31st of the month, all months that have less than 31 days are excluded. Will list untli the LimitYear maximum has been reached. 
'Month,15,4','Month,last,-1' 
Will list the first day of the last four months and list the last day of until the LimitYear maximum is reached. If the current date is the last day of the month the current day is also listed. 
 
Quarter: 
'Quarter,first,-1' 
Will list the first day of a quarter until the LimitYear maximum is reached 
'Quarter,last,6' 
Will list the last day of the past six quarters. If the current date is the last day of the quarter the current day is also listed. 
'Quarter,91,5' 
Will only list the 91st day of each quarter, in non-leap years this will be the last three quarters. In leap years the first quarter also has 91 days and will therefore be included in the results 
'Quarter,92,-1' 
Will only list the 92nd day of each quarter, so only display the 30th of september and 31st of december. The first two quarters of a year have less days and will not be listed. Will run until limityear maximum is reached 
 
Year: 
'Year,last,4' 
Will list the 31st of december for the last 4 years 
'Year,first,-1' 
Will list the 1st of january until the Limityear maximum has been reached 
'Year,15,-1' 
Will list the 15 of january until the LimitYear maximum has been reached 
'Year,366,5' 
Will list only the 366st day, only the last day of the last 5 leap years 
 
Specific Date: 
'Date,2010-05-15' 
Will list 15th of may 2010 
'Date,2012/12/12' 
Will list 12th of december 2012 
 
Date Ranges: 
'DateRange,2010-05-05,10' 
Will list 10 dates, starting at the 5th of May 2010 continuing up until the 14th of May 2010 
 
'LimitYear,2008' 
Will place the limit of LimitYear to 2008, the default value of this parameter is 2010. 
 
Any combination or queries is allowed by comma-separating the queries for example. Query elements Week/Month/Quarter/Year can not be used twice when combining queries. The Date value can be used multiple times: 
'Week,Fri,10','Year,last,-1','LimitYear,1950' 
Will list the last 10 fridays and the 31st of december for all years until the LimitYear is reached 
'Week,Thu,4','Month,last,-1','Quarter,first,6','Year,last,10','LimitYear,2012','Date,1990-12-31','Date,1995-5-31' 
Will list the last four Thursdays, the last day of the month until LimitYear maximum has been reached, the first day of the first 6 quarters and the 31st of december for the last 10 years and the two specific dates 1990-12-31 & 1995-5-31. 
 
.PARAMETER ListOnly 
Only lists, does not remove or modify files. This parameter can be used to establish which files would be deleted if the script is executed. 
 
.PARAMETER VerboseLog 
Logs all delete operations to log, default behaviour of the script is to log failed only. 
 
.PARAMETER AppendLog 
Appends to existing logfile, default behaviour of the script is to replace existing log files if the log file already exists. If log file does not exist log file will be created as it normally would. 
 
.PARAMETER CreateTime 
Deletes files based on CreationTime, the default behaviour of the script is to delete based on LastWriteTime. 
 
.PARAMETER CompareCreateTimeLastModified 
Deletes files based on CreationTime or LastWriteTime, depending which one was last modified. The most recent entry will be used in the comparison, this is especially useful for files that have a CreateTime date which is later than the LastModified date. This occurs when a file is copied to a new location. 
 
.PARAMETER LastAccessTime 
Deletes files based on LastAccessTime, the default behaviour of the script is to delete based on LastWriteTime. 
 
.PARAMETER CleanFolders 
If this switch is specified any empty folder will be removed. Default behaviour of this script is to only delete folders that contained old files. 
 
.PARAMETER NoFolder 
If this switch is specified only files will be deleted and the existing folder will be retained. 
 
.NOTES    
Name: deleteold.ps1 
Author: Jaap Brasser 
Version: 2.0.3 
DateCreated: 2012-03-04 
DateUpdated: 2016-01-27 
 
.LINK 
http://www.jaapbrasser.com 
 
.EXAMPLE    
.\deleteold.ps1 -FolderPath H:\scripts -FileAge 100 -ListOnly -LogFile H:\log.log 
 
Description: 
Searches through the H:\scripts folder and writes a logfile containing files that were last modified 100 days ago and older. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath H:\scripts -FileAge 30 -LogFile H:\log.log -VerboseLog 
 
Description: 
Searches through the H:\scripts folder and deletes files that were modified 30 days ago or before, writes all operations, success and failed, to a logfile on the H: drive. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -FileAge 30 -LogFile H:\log.log -ExcludePath "C:\docs\finance\","C:\docs\hr\" 
 
Description: 
Searches through the C:\docs folder and deletes files, exluding the finance and hr folders in C:\docs. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\Folder -FileAge 30 -LogFile H:\log.log -IncludePath "C:\Folder\Docs\","C:\Folder\Users\" -ExcludePath "C:\docs\finance\","C:\docs\hr\" 
 
Description: 
Only check files in the C:\Folder\Docs\ and C:\Folder\Users\ Folders not any other folders in C:\Folders and explicitly exclude the Finance an HR folders in C:\Folder\Docs. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\Folder -FileAge 30 -LogFile H:\log.log -IncludePath "C:\Folder\Docs\","C:\Folder\Users\" -ExcludePath "C:\docs\finance\","C:\docs\hr\" -ExcludeDate 'Week,Fri,10','Year,last,-1','LimitYear,1950' 
 
Description: 
Only check files in the C:\Folder\Docs\ and C:\Folder\Users\ Folders not any other folders in C:\Folders and explicitly exclude the Finance an HR folders in C:\Folder\Docs. Also excludes files based on Date, excluding the last 10 fridays and the 31st of December for all years back until 1950 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\Folder -FileAge 60 -LogFile H:\log.log -IncludePath .*images.* -RegExPath 
 
Description: 
Delete files older than 60 days and only delete files that contain 'images' in their path name. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\Folder -FileAge 45 -LastAccessTime -LogFile H:\log.log 
 
Description: 
Delete files that have not been access for more than 45 days. 
 
.EXAMPLE 
PowerShell.exe deleteold.ps1 -FolderPath 'H:\admin_jaap' -FileAge 10 -LogFile C:\log -AutoLog 
 
Description: 
Launches the script from batchfile or command prompt a filename is automatically generated since the -AutoLog parameter is used. Note the quotes '' that are used for the FolderPath parameter. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath H:\SQL\BackUp -FileAge 10 -LogFile C:\log -AutoLog -KeepFile 5 
 
Description: 
Log filename is automatically generated since the -AutoLog parameter is used. All files older than ten files will be removed except when there are less than 5 files remaining, then the newest 5 files in each folder will remain. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -FileAge 30 -logfile h:\log.log -CreateTime -NoFolder 
 
Description: 
Deletes all files that were created 30 days ago or before in the C:\docs folder. No folders are deleted. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -FileAge 30 -logfile h:\log.log -CreateTime -CleanFolders 
 
Description: 
Deletes all files that were created 30 days ago or before in the C:\docs folder. Only folders that contained old files and are empty after the deletion of those files will be deleted. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -FileAge 30 -logfile h:\log.log -CompareCreateTimeLastModified 
 
Description: 
Deletes all files that were not created or modified 30 days ago or before in the C:\docs folder. 
 
.EXAMPLE 
.\deleteold.ps1 -folderpath c:\users\jaapbrasser\desktop -fileage 10 -log c:\log.txt -autolog -verboselog -IncludeFileExtension '.xls*','.doc*' 
 
Description: 
Deletes files older than 10 days, only deletes files matching the .xls* and .doc* patterns eg: .doc and .docx files. Log file is stored in the root of the C-drive with an automatically generated name. 
 
.EXAMPLE 
.\deleteold.ps1 -folderpath c:\users\jaapbrasser\desktop -fileage 10 -log c:\log.txt -autolog -verboselog -ExcludeFileExtension .xls 
 
Description: 
Deletes files older than 10 days, excluding xls files. Log file is stored in the root of the C-drive with an automatically generated name. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -FileAge 30 -LogFile h:\log.log -ExcludeDate 'Week,Thu,4','Month,last,-1','Quarter,first,6','Year,last,10','LimitYear,2012','Date,1990-12-31','Date,1995-5-31' 
 
Description: 
Deletes all files that were created 30 days ago or before in the C:\docs folder. With the exclusion of files last modified/created specified in the -ExcludeDate query. 
 
.EXAMPLE    
.\deleteold.ps1 -FolderPath H:\scripts -FileAge 100 -ListOnly -LogFile H:\log.log -ExcludeDate 'DateRange,2005-05-16,8' 
 
Description: 
Searches through the H:\scripts folder and writes a logfile containing files that were last modified 100 days ago and older. Excluding files modified on the 16th of May 2005 and the following seven days. 
 
.EXAMPLE 
.\deleteold.ps1 -FolderPath C:\docs -ListOnly -FileAge 30 -LogFile h:\log.log -ExcludeDate 'Month,15,5','Month,16,5' -EmailTo jaapbrasser@corp.co -EmailFrom jaapbrasser@corp.co -EmailSmtpServer smtp.corp.co 
 
Description: 
Deletes all files that were created 30 days ago or before in the C:\docs folder. With the exclusion of files last modified/created on either the 15th or 16th of the last five months. After completion of the script the log file will be emailed to jaapbrasser@corp.co via the smtp.corp.co smtp server. 
#>