2

I'm trying to figure out how to delete all files in a folder that are older then two days. The last modified date doesn't help. I need to go by the date in the file name. The file will name will be something like: AD-YYMMDD-B7D or BB-YYMMDD-A6C or RE-YYMMDD-A13T. This is difficult because the file name isn't always the same length. This script I found looks like it would help, but I can't figure out how to change the variables and how to set the path.

   @ECHO OFF
ECHO Delete By Date Pattern
ECHO Written by: Jason Faulkner
ECHO SysadminGeek.com
ECHO.
ECHO.

REM Delete/Select files based on a date which utilizes MM and/or DD for file naming patterns.
REM
REM Usage:
REM DeleteByDatePattern {/M | /D} NumberToKeep Path PatternPrefix PatternPostfix [/L | /DEL]
REM     /M     Specifies the pattern being used is based on months.
REM     /D     Specifies the pattern being used is based on days.
REM     NumberToKeep
REM            The number of months (/M) or days (/D) to keep, including the current.
REM            For example, entering 1 keeps only the current month/day and 6 would keep the current minus 5.
REM     Path   The root location to search. Subdirectories will be searched.
REM     PatternPrefix
REM            The file search pattern placed before of the month/day when building the search string.
REM     PatternPostfix
REM            The file search pattern placed after of the month/day when building the search string.
REM     /L     (optional) Lists all files matching the pattern, but does not delete them.
REM     /DEL   (optional) Deletes all files matching the pattern.
REM
REM Examples:
REM     DeleteByDatePattern /M 3 "%WinDir%\system32\LogFiles" ex?? ??.log /DEL
REM         Deletes all IIS log files (Windows Server 2003) except for the current and previous two months.
REM     DeleteByDatePattern /D 7 "D:\Backup" *-????-??- .zip /DEL
REM         Deletes all zip files from the D:\Backup folder except for the current week.
REM         The file name pattern assumed above is "*-YYYY-MM-DD.zip"
REM     DeleteByDatePattern /M 0 "C:\" *( )* /L
REM         Prints a list of all files on the C drive matching the pattern: "*-MM-*" (where MM is replaced with 01-12)
REM     DeleteByDatePattern /D 14 "C:\Logs" Log-???? .txt
REM         Prints a list of all patterns which would be processed by the script.

SETLOCAL EnableExtensions EnableDelayedExpansion

REM Assumes your Windows Date/Time settings are set to 'DayOfWeek M/D/YYYY' format.
REM If your format is different, you will need to alter the variables below so they align.
FOR /F "tokens=1,2,3,4 delims=/ " %%A IN ('DATE /T') DO (
    SET Month=%%B
    SET Day=%%C
    SET Year=%%D
)

IF /I {%1}=={/M} (
    SET Keep=%Month%
    SET Max=12
)
IF /I {%1}=={/D} (
    SET Keep=%Day%
    SET Max=31
    REM Working off of the previous month's max days.
    SET /A PrevMonth=%Month%-1
    IF !PrevMonth! EQU 2 (
        SET Max=28
        REM Leap years... add more as needed.
        IF /I %Year% EQU 2012 SET Max=29
        IF /I %Year% EQU 2016 SET Max=29
    )
    IF /I !PrevMonth! EQU 4 SET Max=30
    IF /I !PrevMonth! EQU 6 SET Max=30
    IF /I !PrevMonth! EQU 9 SET Max=30
    IF /I !PrevMonth! EQU 11 SET Max=30
)
SET Current=%Keep%
SET /A Keep=%Keep%-%2+1

REM Determine the range to be removed.
SET /A RemoveHighStart=%Current%+1
IF /I %Keep% LSS 1 (
    SET RemoveLow=0
    SET /A RemoveHighEnd=%Keep%+%Max%-1
) ELSE (
    SET /A RemoveLow=%Keep%-1
    SET RemoveHighEnd=%Max%
)

REM Process all less than the low range.
FOR /L %%Z IN (1,1,%RemoveLow%) DO CALL :Process %%Z %3 %4 %5 %6
REM Process all greater than the high range.
FOR /L %%Z IN (%RemoveHighStart%,1,%RemoveHighEnd%) DO CALL :Process %%Z %3 %4 %5 %6

ENDLOCAL
GOTO End


:Process
SET Key=0%1
SET Key=%Key:~-2%
SET Target="%~2\%~3%Key%%~4"
ECHO Target Pattern: %Target%

IF /I {%5}=={/L} DIR %Target% /B /S
IF /I {%5}=={/DEL} DEL /F /S /Q %Target%
GOTO End

:End
1
  • Last modified date wouldn't help - what about Creation date? You can use 'dir /t:c' to get that. Nov 5, 2012 at 17:30

1 Answer 1

1

The Batch file below assume that:

  • All files have the date in the name in format: XX-YYMMDD-XX.ext
  • The year is a 2-digit 2000-based number (ie, 12 for year 2012)
  • Your locale date format is MM/DD/YYYY
  • The number of days to delete older files is given in first parameter (default=2)

.

@echo off
setlocal EnableDelayedExpansion
rem First parameter indicate number of days (default=2)
set days=2
if "%1" neq "" set days=%1

rem Get Julian Day Number from todays date
for /F "tokens=1-3 delims=/" %%a in ("%date%") do (
   set /A m=1%%a %% 100, d=1%%b %% 100, set y=%%c
)
set /A A=(m-14)/12, todayJDN = (1461*(y+4800+A))/4 + (367*(m-2-12*A))/12 - (3*((y+4900+A)/100))/4 + d - 32075

rem Process all files
for %%a in (*.*) do (
   rem Get date from file name (second token separated by hypen)
   for /F "tokens=2 delims=-" %%b in ("%%a") do set fileDate=%%b
   rem Get Julian Day Number from file date
   set y=20!fileDate:~0,2!
   set m=1!fileDate:~2,2! %% 100
   set d=1!fileDate:~4,2! %% 100
   set /A A=(m-14)/12, fileJDN = (1461*(y+4800+A))/4 + (367*(m-2-12*A))/12 - (3*((y+4900+A)/100))/4 + d - 32075
   rem Remove files older than given days
   set /A daysOlder=todayJDN - fileJDN
   if !daysOlder! gtr %days% ECHO rem "%%a"
)

Test first the program and check the results, then remove the ECHO command in last line to really delete the files.

Julian Day Number is described here: http://www.hermetic.ch/cal_stud/jdn.htm

You must log in to answer this question.