Automatic file deletion based on file age
Does anyone know of a good way to delete files based on their age and have it done periodically, say using a batch file and windows scheduler? (Or any other decent software that would do this as well)
+1 for 'forfiles"
here's what I use in a batch file that runs nightly:
forfiles -pE:\myfolder\mysubfolder -m*.* -d-5 -c"cmd /C del /q @FILE"
You can use the forfiles commnad. Just use the windows scheduler to schedule it directly.
Some more examples.
Yes, I've got one we use. Found it online and made some modifications to it.
This would be run as
deletefiles.bat 5 C:\Temp *.LOG 1
and would delete all the log files in C:\Temp and its subdirectories more than 5 days old
Ah, found the original post
@echo off
CLS
:HouseKeeping
REM Start Time
REM This will load the current time into 'Start' variables.
REM.
Set Start_Time=%time%
FOR /f "tokens=1-3 delims=:." %%a in ('echo %time%') do (
set Start_hh=%%a
set Start_mm=%%b
set Start_ss=%%c
)
FOR /f "tokens=1-3 delims=: " %%a in ('time /t') do (set Start_Meridan=%%c)
Echo Start Time: %Start_hh%:%Start_mm%:%Start_ss% %Start_Meridan%
REM Echo Start Time: %Start_hh%:%Start_mm%:%Start_ss%
Set Delete_Counter=0
Set FChecked_Counter=0
Set Total_Files=0
Set Finish_day=0
SET OLDERTHAN=%1
SET FileDir=%~2
SET EXT=%3
SET Sub_Dir=%4
SET Force_Check=%5
IF NOT DEFINED OLDERTHAN GOTO SYNTAX
IF NOT DEFINED FileDir GOTO SYNTAX
IF NOT DEFINED EXT GOTO SYNTAX
IF NOT DEFINED Force_Check Goto Get_Date
IF DEFINED Force_Check Goto Read_Only
Goto Exit
:Read_Only
IF %Force_Check%==1 set Force_Delete=/F
Goto Get_Date
REM Get Todays Date
:Get_Date
FOR /f "tokens=1-4 delims=/- " %%a in ('date /t') do (
set xx=%%a
set mm=%%b
set dd=%%c
set yyyy=%%d
)
set /A mm=%mm%+0
if %dd%==01 set dd=1
if %dd%==02 set dd=2
if %dd%==03 set dd=3
if %dd%==04 set dd=4
if %dd%==05 set dd=5
if %dd%==06 set dd=6
if %dd%==07 set dd=7
if %dd%==08 set dd=8
if %dd%==09 set dd=9
set /A dd=%dd%+0
set /A dd=%dd% - %OLDERTHAN%
set /A yyyy=%yyyy%+0
:LOOPDATE
if /I %dd% GTR 0 Goto DONE
set /A mm=%mm% - 1
if /I %mm% GTR 0 Goto ADJUSTDAY
set /A mm=12
set /A yyyy=%yyyy% - 1
:ADJUSTDAY
if %mm%==1 Goto SET31
if %mm%==2 Goto LEAPCHK
if %mm%==3 Goto SET31
if %mm%==4 Goto SET30
if %mm%==5 Goto SET31
if %mm%==6 Goto SET30
if %mm%==7 Goto SET31
if %mm%==8 Goto SET31
if %mm%==9 Goto SET30
if %mm%==10 Goto SET31
if %mm%==11 Goto SET30
if %mm%==12 Goto SET31
:SET31
set /A dd=31 + %dd%
Goto LOOPDATE
:SET30
set /A dd=30 + %dd%
Goto LOOPDATE
:LEAPCHK
set /A tt=%yyyy% %% 4
if not %tt%==0 Goto SET28
set /A tt=%yyyy% %% 100
if not %tt%==0 Goto SET29
set /A tt=%yyyy% %% 400
if %tt%==0 Goto SET29
:SET28
set /A dd=28 + %dd%
Goto LOOPDATE
:SET29
set /A dd=29 + %dd%
:DONE
if /i %dd% LSS 10 set dd=0%dd%
rem if /I %mm% LSS 10 set mm=0%mm%
:Search_Type
IF NOT DEFINED Sub_Dir GOTO No_Sub_Dir
If %Sub_Dir%==0 Goto :No_Sub_Dir
If %Sub_Dir%==1 Goto :Sub_Directory
Else Goto :No_Sub_Dir
:No_Sub_Dir
for %%i in (%FileDir%\%EXT%) do (
set FileName=%%i
call :PROCESSFILE %%~ti)
Goto Print_Results
:Sub_Directory
for /R %FileDir% %%i in (%EXT%) DO (
set FileName=%%i
call :PROCESSFILE %%~ti)
Goto Print_Results
:Print_Results
Echo.
Echo The number of files deleted : %Delete_Counter%
Echo.
Echo The number of files passed over : %FChecked_Counter%
Echo.
Echo The Total number of files processed: %Total_Files%
Echo.
Goto Get_Finish_Time
:Get_Finish_Time
REM This will load the current time into 'Finish' variables.
REM.
FOR /f "tokens=1-3 delims=:." %%a in ('echo %time%') do (
set Finish_hh=%%a
set Finish_mm=%%b
set Finish_ss=%%c
)
FOR /f "tokens=1-3 delims=: " %%a in ('time /t') do (set Finish_Meridan=%%c)
Goto Calculate_Time
:Calculate_Time
REM Calculate the difference in time between Start and Finish times
REM.
IF %Start_ss% GTR %Finish_ss% (
set /A Finish_ss=%Finish_ss%+60
set /A Finish_mm=%Finish_mm%-1
)
set /A Diff_ss=%Finish_ss%-%Start_ss%
IF %Start_mm% GTR %Finish_mm% (
set /A Finish_mm=%Finish_mm%+60
set /A Finish_hh=%Finish_hh%-1
)
set /A Diff_mm=%Finish_mm%-%Start_mm%
IF %Start_hh% GTR %Finish_hh% (
set /A Finish_hh=%Finish_hh%+24
set Finish_day=1
)
set /A Diff_hh=%Finish_hh%-%Start_hh%
REM The follow will adjust for negative time values.
REM.
REM if %Diff_hh% LSS 0 (set /A Diff_hh=%Diff_hh%+23)
REM if %Diff_mm% LSS 0 (set /A Diff_mm=%Diff_mm%+59)
REM if %Diff_ss% LSS 0 (set /A Diff_ss=%Diff_ss%+59)
REM The following will compensate for single digit results.
REM.
if %Diff_hh%==0 set Diff_hh=00
if %Diff_hh%==1 set Diff_hh=01
if %Diff_hh%==2 set Diff_hh=02
if %Diff_hh%==3 set Diff_hh=03
if %Diff_hh%==4 set Diff_hh=04
if %Diff_hh%==5 set Diff_hh=05
if %Diff_hh%==6 set Diff_hh=06
if %Diff_hh%==7 set Diff_hh=07
if %Diff_hh%==8 set Diff_hh=08
if %Diff_hh%==9 set Diff_hh=09
if %Diff_mm%==0 set Diff_mm=00
if %Diff_mm%==1 set Diff_mm=01
if %Diff_mm%==2 set Diff_mm=02
if %Diff_mm%==3 set Diff_mm=03
if %Diff_mm%==4 set Diff_mm=04
if %Diff_mm%==5 set Diff_mm=05
if %Diff_mm%==6 set Diff_mm=06
if %Diff_mm%==7 set Diff_mm=07
if %Diff_mm%==8 set Diff_mm=08
if %Diff_mm%==9 set Diff_mm=09
if %Diff_ss%==0 set Diff_ss=00
if %Diff_ss%==1 set Diff_ss=01
if %Diff_ss%==2 set Diff_ss=02
if %Diff_ss%==3 set Diff_ss=03
if %Diff_ss%==4 set Diff_ss=04
if %Diff_ss%==5 set Diff_ss=05
if %Diff_ss%==6 set Diff_ss=06
if %Diff_ss%==7 set Diff_ss=07
if %Diff_ss%==8 set Diff_ss=08
if %Diff_ss%==9 set Diff_ss=09
Goto Print_Time
:Print_Time
REM This will return the results to the user.
REM.
Set End_Time=%time%
Echo.
Echo The program started at: %Start_Time% %Start_Meridan%
Echo The program ended at : %End_Time% %Finish_Meridan%
Echo hh:mm:ss.mm
Echo.
Echo This is the amount of time elapsed from the
Echo start to the end of the program executing.
Echo.
Echo %Diff_hh%:%Diff_mm%:%Diff_ss%
Echo hh:mm:ss
Echo. Number of Days Elapsed: %Finish_day%
Goto Reset_Variables
:Reset_Variables
REM The following will reset the variables used by this program.
REM A.K.A. cleaning up.
set mm=
set yyyy=
set dd=
set thedate=
set xx=
set tt=
set FileDir=
set FileName=
set ext=
set OlderThan=
set Sub_Dir=
set Delete_Counter=
set Total_Files=
set FChecked_Counter=
set Force_Check=
set Force_Delete=
set Diff_hh=
set Diff_mm=
set Diff_ss=
set Start_hh=
set Start_mm=
set Start_ss=
set Start_Meridan=
set Finish_hh=
set Finish_mm=
set Finish_ss=
set Finish_Meridan=
set mm=
set hh=
set ss=
set Start_Time=
set End_Time=
set Finish_day=
Goto Exit
GOTO Exit
:PROCESSFILE
set temp=%1
set fyyyy=%temp:~6%
if /I %fyyyy% LSS 100 set fyyyy=20%fyyyy%
if /I %fyyyy% GTR 2069 set fyyyy=19%temp:~6%
set fmm=%temp:~0,2%
set fdd=%temp:~3,2%
:: +*************************************+
:: | This is where the files are deleted |
:: | Change the DIR command to DEL to |
:: | delete. DIR is used for test. |
:: +*************************************+
if /I %yyyy%/%mm%/%dd% GEQ %fyyyy%/%fmm%/%fdd% (
rem Echo %yyyy%/%mm%/%dd% "- The selected file will be deleted. F: " %fyyyy%/%fmm%/%fdd% %FileName% >> files.txt
echo %FileName% >> d:\deletelog%yyyy%-%mm%-%dd%.txt
del %FileName% >> d:\deletelog%yyyy%-%mm%-%dd%.txt
rem Dir %Force_Delete% "%FileName%"
Set /A Delete_Counter=%Delete_Counter%+1
Set /A Total_Files=%Total_Files%+1
Echo.
) Else (
rem Echo %yyyy%/%mm%/%dd% " - The selected file does not qualify for deletion. F: " %fyyyy%/%fmm%/%fdd% %FileName% "%FileName%" >> files.txt
Set /A FChecked_Counter=%FChecked_Counter%+1
Set /A Total_Files=%Total_Files%+1
Echo.)
set temp=
set fyyyy=
set fmm=
set fdd=
:EXIT