Take the 2-minute tour ×
Server Fault is a question and answer site for system and network administrators. It's 100% free, no registration required.

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)

share|improve this question
    
You already answered your question. –  Andrejs Cainikovs Sep 18 '09 at 13:55

4 Answers 4

up vote 4 down vote accepted

+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"

share|improve this answer
    
Perfect - this is exactly what I'm looking for, thanks a bunch! –  jjrab Sep 18 '09 at 16:39

You can use the forfiles commnad. Just use the windows scheduler to schedule it directly.

Some more examples.

share|improve this answer

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
share|improve this answer
3  
OMG, that's one of the longest scripts that I have seen in a the longest time that does something that you can do with a single command ;-) ServerFault should introduce an award for this kind of post... this script almost make calculating 5+5 using one's fingers seem high-tech! –  Jessica McKinnon Sep 18 '09 at 15:09

Here's a Powershell script you can use in a scheduled task. (Also used this in this answer for purging IIS log files).

set-location [enter-path-to-folder]
foreach ($File in get-childitem) {
   if ($File.LastWriteTime -lt (Get-Date).AddDays(-30)) {
      del $File
   }
}

Change the folder path to your target, tweak AddDays as appropriate. -30 removes things older than 30 days.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.