@echo off REM This batch file returns a list of the subdirectories under the REM current directory where the newest file in that subdirectory and REM its subdirectories is older than 365 days old. So if you want REM to archive some of the directories under I:\PROJECT\SUR\, open REM up a DOS window, make I;\PROJECT\SUR\ your current directory, REM and run 1YEAROLD.BAT. You will then see a list of all the REM subdirectories with no files newer than a year old. The date REM routines were taken from Simon Sheppard's website REM http://www.ss64.com/ntsyntax/index.html REM The cutoff date is hard-wired in, and can be changed. You could REM also add a switch so it would produce a clean output (only REM directory names) or tee the output to a file. REM YES! It's TERRIBLE! WDK 2007 setlocal rem get today's date call :getdate rem set rem pause rem prompt for number of days set cutoff_age=365 rem FIX THIS for /d %%a in (*.*) do (call :loop1 "%%~f%a") goto end :loop1 rem echo %%~f%a REM echo In loop1 REM echo %1 set dirname=%1% REM echo DIRNAME %dirname% set new=NO set newest= for /r %1 %%b in (*.*) do (call :loop2 %%~t%b) REM pause REM set REM pause if %new% == YES goto skip3 if defined newest goto has_newest echo %dirname% - no files goto skip3 :has_newest echo %dirname% - newest file %newest% days old. :skip3 REM pause goto :eof :loop2 REM echo In loop2 REM echo %1 REM echo %dirname% rem pause set strng=%1 for /f "usebackq tokens=1-3 delims=/" %%q in ('%strng%') do (set var1=%%q&set var2=%%r&set var3=%%s) rem echo %var1% %var2% %var3% rem echo %dd% %mm% %yy% set var3=%var3:~2,2% set yyy=%yy:~2,2% call :datemath2 %yyy% %mm% %dd% - %var3% %var1% %var2% rem echo :datemath2 %var3% %var1% %var2% - %yyy% %mm% %dd% rem pause rem echo file date %var3% %var1% %var2% - file is %v_dd_int% days old set /a age = v_dd_int REM echo NEWEST is %newest% REM echo NEW is %new% REM echo AGE is %age% REM pause if defined newest goto compare REM echo NEWEST not defined set newest=%age% goto skip1 :compare if %newest% gtr %age% set newest=%age% :skip1 if %age% lss %cutoff_age% goto toonew REM echo AGE is %age% OLD ENOUGH, ignore goto skip2 :toonew REM echo TOO NEW set new=YES :skip2 rem pause goto :eof :getdate for /f "tokens=1-4 delims=/-. " %%g in ('date /t') do (call :s_fixdate %%g %%h %%i %%j) goto :eof :s_fixdate if "%1:~0,1%" gtr "9" shift for /f "skip=1 tokens=2-4 delims=(-)" %%g in ('echo.^|date') do (set %%g=%1&set %%h=%2&set %%i=%3) goto :eof :datemath2 SET v_dd_int=0 SET v_mm_int=0 SET v_yy_int=0 SET v_ymd_str= SET v_mm_str= SET v_dd_str= IF "%3"=="" goto s_syntax IF "%4"=="+" goto s_validate_year IF "%4"=="-" goto s_validate_year IF "%4"=="" goto s_validate_year :s_syntax echo. echo DATEMATH SYNTAX: echo _______________ echo. echo DateMath will set the variables as listed below echo 'str' variables include leading zeros e.g. "01" echo 'int' variables leading zeros are stripped e.g. "1" echo. echo CALL DateMath YY MM DD - YY2 MM2 DD2 echo. echo Will set variable v_dd_int to the signed difference echo between the 2 dates (measured in days) echo. echo. echo CALL DateMath YY MM DD +/- Days echo. echo Will set the following variables to the result of echo adding or substracting days from the initial date: echo v_ymd_str, v_yy_int echo v_mm_str, v_mm_int, echo v_dd_str, v_dd_int echo. echo. echo ___________________________________ pause echo. echo. echo CALL DateMath YY MM DD echo. echo Will set the following variables: echo v_ymd_str, v_yy_int echo v_mm_str, v_mm_int, echo v_dd_str, v_dd_int echo. echo ___________________________________ echo. echo v_ymd_str is in YYYYMMDD format. echo. echo v_yy_int is in YYYY format, even if YY format was originally supplied. echo This conversion is useful for FAT/NTFS file dates which are in YY format. echo. SET /a v_dd_int=999999 goto :eof :s_validate_year ::strip leading zeros SET v_yy=%1 if %v_yy:~0,1% EQU 0 set v_yy=%v_yy:~1% :: Check for Y2K IF %v_yy% LSS 100 IF %v_yy% GEQ 80 SET /A v_yy += 1900 IF %v_yy% LSS 80 SET /A v_yy += 2000 :: at this point v_yy contains a 4 digit year ::validate month and day if %2 GTR 12 goto s_syntax if %3 GTR 31 goto s_syntax SET v_mm=%2 SET v_dd=%3 ::strip leading zeros if %v_mm:~0,1% EQU 0 set v_mm=%v_mm:~1% if %v_dd:~0,1% EQU 0 set v_dd=%v_dd:~1% :: Set the int variables SET /a v_dd_int=%v_dd% SET /a v_yy_int=%v_yy% SET /a v_mm_int=%v_mm% :: Determine which function to perform - ADD, SUBTRACT or CONVERT If not "%6"=="" goto s_validate_2nd_date if "%4"=="" goto s_convert_only :: Add or subtract days to a date SET /a v_number_of_days=%5 goto s_add_or_subtract_days :s_convert_only SET /a v_dd_int=%v_dd% IF %v_dd% LEQ 9 (SET v_dd_str=0%v_dd%) ELSE (SET v_dd_str=%v_dd%) IF %v_mm% LEQ 9 (SET v_mm_str=0%v_mm%) ELSE (SET v_mm_str=%v_mm%) SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str% rem ECHO DATEMATH - Convert date only (no maths) goto s_end :::::::::::::::::::::::::::::::::::::::::::::::::: :s_validate_2nd_date If "%4"=="+" goto s_syntax :: Subtracting one date from another :::::: :: strip leading zero SET v_yy2=%5 if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1% if %v_yy2% GTR 99 goto s_validate2nd_month if %v_yy2% GTR 49 goto s_prefix_2_1950_1999 if %v_yy2% LSS 10 goto s_prefix_2_2000_2009 SET v_yy2=20%v_yy2% goto s_validate2nd_month :s_prefix_2_2000_2009 SET v_yy2=200%v_yy2% goto s_validate2nd_month :s_prefix_2_1950_1999 SET v_yy2=19%v_yy2% :s_validate2nd_month ::strip leading zeros ::SET /a v_yy2=%v_yy2% if %v_yy2:~0,1% EQU 0 set v_yy2=%v_yy2:~1% ::v_yy2 now contains a 4 digit year if %6 GTR 12 goto s_syntax SET v_mm2=%6 if %7 GTR 31 goto s_syntax SET v_dd2=%7 ::strip leading zeros ::SET /a v_mm2=%v_mm2% if %v_mm2:~0,1% EQU 0 set v_mm2=%v_mm2:~1% ::SET /a v_dd2=%v_dd2% if %v_dd2:~0,1% EQU 0 set v_dd2=%v_dd2:~1% call :s_julian_day %v_yy_int% %v_mm_int% %v_dd_int% SET v_sumdays1=%v_JulianDay% call :s_julian_day %v_yy2% %v_mm2% %v_dd2% SET v_sumdays2=%v_JulianDay% SET /a v_dd_int=%v_sumdays1% - %v_sumdays2% rem ECHO DATEMATH - Subtracting one date from another = days difference rem ECHO ~~~~~~ rem ECHO %v_dd_int% rem ECHO ~~~~~~ goto s_end_days :::::::::::::::::::::::::::::::::::::::::::::::::: :s_add_or_subtract_days if /i "%4"=="+" goto s_add_up_days :: Subtract all days :::::: SET /a v_dd=%v_dd% - %v_number_of_days% :s_adjust_month_year if %v_dd% GEQ 1 goto s_add_subtract_days_DONE SET /a v_mm=%v_mm% - 1 if %v_mm% GEQ 1 goto s_add_days_%v_mm% SET /a v_yy=%v_yy% - 1 SET /a v_mm=%v_mm% + 12 goto s_add_days_%v_mm% :s_add_days_2 SET /a v_dd=%v_dd% + 28 SET /a v_leapyear=%v_yy% / 4 SET /a v_leapyear=%v_leapyear% * 4 if %v_leapyear% NEQ %v_yy% goto s_adjust_month_year SET /a v_dd=%v_dd% + 1 goto s_adjust_month_year :s_add_days_4 :s_add_days_6 :s_add_days_9 :s_add_days_11 SET /a v_dd=%v_dd% + 30 goto s_adjust_month_year :s_add_days_1 :s_add_days_3 :s_add_days_5 :s_add_days_7 :s_add_days_8 :s_add_days_10 :s_add_days_12 SET /a v_dd=%v_dd% + 31 goto s_adjust_month_year :s_add_up_days :: add all days :::::: SET /a v_dd=%v_dd% + %v_number_of_days% :s_subtract_days_ goto s_subtract_days_%v_mm% :s_adjust_mth_yr SET /a v_mm=%v_mm% + 1 if %v_mm% LEQ 12 goto s_subtract_days_%v_mm% SET /a v_yy=%v_yy% + 1 SET /a v_mm=%v_mm% - 12 goto s_subtract_days_%v_mm% :s_subtract_days_2 SET /a v_leapyear=%v_yy% / 4 SET /a v_leapyear=%v_leapyear% * 4 If %v_leapyear% EQU %v_yy% goto s_subtract_leapyear if %v_dd% LEQ 28 goto s_add_subtract_days_DONE SET /a v_dd=%v_dd% - 28 goto s_adjust_mth_yr :s_subtract_leapyear if %v_dd% LEQ 29 goto s_add_subtract_days_DONE SET /a v_dd=%v_dd% - 29 goto s_adjust_mth_yr :s_subtract_days_4 :s_subtract_days_6 :s_subtract_days_9 :s_subtract_days_11 if %v_dd% LEQ 30 goto s_add_subtract_days_DONE SET /a v_dd=%v_dd% - 30 goto s_adjust_mth_yr :s_subtract_days_1 :s_subtract_days_3 :s_subtract_days_5 :s_subtract_days_7 :s_subtract_days_8 :s_subtract_days_10 :s_subtract_days_12 if %v_dd% LEQ 31 goto s_add_subtract_days_DONE SET /a v_dd=%v_dd% - 31 goto s_adjust_mth_yr :s_add_subtract_days_DONE SET /a v_dd_int=%v_dd% SET /a v_mm_int=%v_mm% SET /a v_yy_int=%v_yy% IF %v_dd% GTR 9 (SET v_dd_str=%v_dd%) ELSE (SET v_dd_str=0%v_dd%) IF %v_mm% GTR 9 (SET v_mm_str=%v_mm%) ELSE (SET v_mm_str=0%v_mm%) SET v_ymd_str=%v_yy%%v_mm_str%%v_dd_str% rem ECHO DATEMATH - add or subtract days from a date = new date goto s_end :::::::::::::::::::::::::::::::::::::::::::::::::: :s_julian_day SET v_year=%1 SET v_month=%2 SET v_day=%3 SET /a v_month=v_month SET /a v_day=v_day SET /A a = 14 - v_month SET /A a /= 12 SET /A y = v_year + 4800 - a SET /A m = v_month + 12 * a - 3 SET /A m = 153 * m + 2 SET /A m /= 5 SET /A v_JulianDay = v_day + m + 365 * y + y / 4 - y / 100 + y / 400 - 32045 rem ECHO The Julian Day is [%v_JulianDay%] goto :eof :::::::::::::::::::::::::::::::::::::::::::::::::: :s_end rem ECHO ~~~~~~~~~~~~ rem ECHO [%v_ymd_str%] YY=[%v_yy_int%] MM=[%v_mm_str%] DD=[%v_dd_str%] rem ECHO ~~~~~~~~~~~~ echo %v_dd_int% :s_end_days rem ENDLOCAL&SET /a v_yy_int=%v_yy_int%&SET /a v_mm_int=%v_mm_int%&SET /a v_dd_int=%v_dd_int%&SET v_ymd_str=%v_ymd_str%&SET v_mm_str=%v_mm_str%&SET v_dd_str=%v_dd_str% goto :eof :end endlocal