Howdy
In windows 2000 I need to go to a directory and delete any subdirectories ( and their files ) that are more than 1 week old.
I know a little about batch programming, but this really has me confused.
Anyone know anything about how to do this or have code to do it please?
thanks
Frank.
Deleting old directories
Moderator: DosItHelp
Frank,
Date / Time calculation in batch is tricky. Using batch functions you can minimize the clutter in your main script to the following:
You will need the following functions:
eleteIfOld
:ftime
:jdate
:date2jdate
:jdate2date
Here they are:
DosItHelp?
Date / Time calculation in batch is tricky. Using batch functions you can minimize the clutter in your main script to the following:
Code: Select all
@echo off
SETLOCAL ENABLEEXTENSIONS
set "days=7"
set "srcpath=%temp%"
call:jdate tnow "%date%"
for /f "tokens=*" %%F in ('dir /b "%srcpath%.\*.*"') do (
call:DeleteIfOld "%%~$srcpath:F" "%days%" "%tnow%"
)
ECHO.
PAUSE
GOTO:EOF
You will need the following functions:
eleteIfOld
:ftime
:jdate
:date2jdate
:jdate2date
Here they are:
Code: Select all
@echo off
SETLOCAL ENABLEEXTENSIONS
set "srcpath=%temp%"
call:jdate tnow "%date%"
for /f "tokens=*" %%F in ('dir /b "%srcpath%.\*.*"') do (
call:DeleteIfOld "%%~$srcpath:F" "449" "%tnow%"
)
ECHO.
PAUSE
GOTO:EOF
::-----------------------------------------------------------------------------------
::-- Functions start below here
::-----------------------------------------------------------------------------------
:DeleteIfOld name days tnow -- deletes file or directory if older than given number of days
:: -- name [in] - name of file or directory
:: -- days [in] - number of days to expire
:: -- tnow [in] - today's date in julia days
:$source www.DosTips.com
SETLOCAL
set "days=%~2"
set "tnow=%~3"
call:ftime tfile "%~1"
set /a "diff=tnow-tfile"
if %diff% LEQ %days% EXIT /b %ERRORLEVEL
set "attr=%~a1"
rem ECHO.%attr%, %attr:~0,1%, %~nx1 is %diff% days old
if /i "%attr:~0,1%"=="d" (
rd /Q /S "%~1"
) ELSE (
del /Q "%~1"
)
EXIT /b %ERRORLEVEL%
:ftime JD filename attr -- compares the time of two files, succeeds if condition is met, fails otherwise
:: -- JD [out] - valref file time in julian days
:: -- attr [in,opt] - time field to be used, creation/last-access/last-write, see 'dir /?', i.e. /tc, /ta, /tw, default is /tw
::source www.DosTips.com
SETLOCAL
set file=%~2
set attr=%~3
if "%attr%"=="" set attr=/tw
for /f %%a in ('"dir %attr% /-c "%file%"|findstr "^^[0-1]""') do set T=%%a
call:jdate JD "%T%"
( ENDLOCAL & REM RETURN VALUES
IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
)
EXIT /b %ERRORLEVEL%
:jdate JD DateStr -- converts a date string into julian day number
:: -- JD [out] - julian days
:: -- DateStr [in] - date string, i.e. "03/31/2006" or "Fri 03/31/2006"
::source www.DosTips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set DateStr=%~2
set DateStr=%DateStr:~-10%&rem consider only the last 10 characters
for /f "tokens=1-3 delims=/ " %%a in ("%DateStr%") do (
set /a YYYY=1%%c-10000
set /a MM=1%%a-100
set /a DD=1%%b-100
)
call:date2jdate JD "%YYYY%" "%MM%" "%DD%"
( ENDLOCAL & REM RETURN VALUES
IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
)
EXIT /b %ERRORLEVEL%
:date2jdate JD YYYY MM DD -- converts a gregorian calender date into julian day format
:: -- JD [out] - julian days
:: -- YYYY [in] - gregorian year, i.e. 2006
:: -- MM [in] - gregorian month, i.e. 12 for december
:: -- DD [in] - gregorian day, i.e. 31
:: -- reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html
::source www.DosTips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set YYYY=%~2
set MM=%~3
set DD=%~4
set /a I=%YYYY%
set /a J=%MM%
set /a K=%DD%
set /a JD=K-32075+1461*(I+4800+(J-14)/12)/4+367*(J-2-(J-14)/12*12)/12-3*((I+4900+(J-14)/12)/100)/4
( ENDLOCAL & REM RETURN VALUES
IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
)
EXIT /b %ERRORLEVEL%
:jdate2date JD YYYY MM DD -- converts julian days into gregorian date format
:: -- JD [in] - julian days
:: -- YYYY [out] - gregorian year, i.e. 2006
:: -- MM [out] - gregorian month, i.e. 12 for december
:: -- DD [out] - gregorian day, i.e. 31
:: -- reference http://aa.usno.navy.mil/faq/docs/JD_Formula.html
::source www.DosTips.com
SETLOCAL ENABLEDELAYEDEXPANSION
set /a L= %~1+68569
set /a N= 4*L/146097
set /a L= L-(146097*N+3)/4
set /a I= 4000*(L+1)/1461001
set /a L= L-1461*I/4+31
set /a J= 80*L/2447
set /a K= L-2447*J/80
set /a L= J/11
set /a J= J+2-12*L
set /a I= 100*(N-49)+I+L
set /a YYYY= I
set /a MM= J
set /a DD= K
( ENDLOCAL & REM RETURN VALUES
IF "%~2" NEQ "" SET %~2=%YYYY%
IF "%~3" NEQ "" SET %~3=%MM%
IF "%~4" NEQ "" SET %~4=%DD%
)
EXIT /b %ERRORLEVEL%
DosItHelp?