1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.

Batch to Print or Delete Files by a Specified Age of Days

Discussion in 'Programming' started by Cleptography, Mar 16, 2011.

  1. Cleptography

    Cleptography New Member

    Joined:
    Sep 2, 2010
    Messages:
    39
    Likes Received:
    7
    Trophy Points:
    0
    This script excepts command line arguments and will either print to the command screen or delete files older than or less than the specified number of days.

    Script



    Code:
    @echo off
    SETLOCAL ENABLEEXTENSIONS
    SETLOCAL ENABLEDELAYEDEXPANSION
    
    :: ######################################################################################################
    :: ScriptName...............: FileAges.bat
    :: Original Author..........: http://www.dostips.com
    :: Modified By..............: Cleptography
    :: ScriptPurpose............: Prints or Deletes files older than or newer than a specified number of days
    :: Required Files...........: N/A
    :: Date.....................: 03/16/2011
    :: Time.....................: 16:01:35.16
    :: System Requirements......: Windows XP/Vista/7
    :: Syntax...................: FileAges (Switch) (Val) (Switch) ("DirPath")
    :: Examples.................: FileAges "%HomeDrive%\"
    :: .........................: FileAges MoreThan 250 Print "%HomeDrive%\"
    :: .........................: FileAges LessThan 250 Print "%HomeDrive%\"
    :: .........................: FileAges MoreThan 250 Del "%HomeDrive%\"
    :: .........................: FileAges LessThan 250 Del "%HomeDrive%\"
    :: Notes....................: Original script printed all files only and in the current directory from
    :: .........................: which it was ran.
    :: .........................: This version excepts command arguments to specify exact days and specific
    :: .........................: directories, with the option to print or delete those files.
    :: .........................: Future plans to specify exact file extensions
    ::######################################################################################################
    
    set str=%*
    
    for /f "tokens=1,2,3,4" %%a in ("%str%") do (
        if /i "%%a"=="LessThan" (
            if /i "%%c"=="print" (
                set AgeName=%%a
                set AgeNumb=%%b
                set W2Do=%%c
                set Directory=%%d
                goto :NewPrint
            ) else if /i "%%a"=="LessThan" (
                if /i "%%c"=="del" (
                    set AgeName=%%a
                    set AgeNumb=%%b
                    set W2Do=%%c
                    set Directory=%%d
                    goto :NewDelete
                )
            )
        )
    )
    for /f "tokens=2,3,4,5" %%a in ("%str%") do (
        if /i "%%a"=="MoreThan" (
            if /i "%%c"=="print" (
                set AgeName=%%a
                set AgeNumb=%%b
                set W2Do=%%c
                set Directory=%%d
                goto :OldPrint
            ) else if /i "%%a"=="MoreThan" (
                if /i "%%c"=="del" (
                    set AgeName=%%a
                    set AgeNumb=%%b
                    set W2Do=%%c
                    set Directory=%%d
                    goto :OldDelete
                )
            )
        )
    )
    :ShowAll
    set directory=%~1
    if not defined directory echo.Error No Arguments Specified&& goto :eof
    cd "%directory%"
    call:jdate tnow "%date%"
    for %%F in (*.*) do (
        call:ftime tfile "%%F"
        set /a diff=tnow-tfile
        echo.%%~nxF is !diff! days old
    )
    goto :eof
    :OldPrint
    cd "%directory%"
    call:jdate tnow "%date%"
    for %%F in (*.*) do (
        call:ftime tfile "%%F"
        set /a diff=tnow-tfile
            if !diff! GEQ %AgeNumb% (echo.%%~nxF is !diff! days old
        )
    )
    goto :eof
    :OldDelete
    cd "%directory%"
    call:jdate tnow "%date%"
    for %%F in (*.*) do (
        call:ftime tfile "%%F"
        set /a diff=tnow-tfile
            if !diff! GEQ %AgeNumb% (del /f /q %directory%%%~nxF
        )
    )
    goto :eof
    :NewPrint
    cd "%directory%"
    call:jdate tnow "%date%"
    for %%F in (*.*) do (
        call:ftime tfile "%%F"
        set /a diff=tnow-tfile
            if !diff! LEQ %AgeNumb% (echo.%%~nxF is !diff! days old
        )
    )
    goto :eof
    :NewDelete
    cd "%directory%"
    call:jdate tnow "%date%"
    for %%F in (*.*) do (
        call:ftime tfile "%%F"
        set /a diff=tnow-tfile
            if !diff! LEQ %AgeNumb% (del /f /q %directory%%%~nxF
        )
    )
    goto :eof
    
    :ftime JD filename attr -- returns the file time in julian days
    ::                      -- 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
    :$created 20060101 :$changed 20090322 :$categories DateAndTime
    :$source http://www.dostips.com
    SETLOCAL
    set file=%~2
    set attr=%~3
    if not defined attr (call:jdate JD "- %~t2"
    ) ELSE (for /f %%a in ('"dir %attr% /-c "%file%"|findstr "^^[0-9]""') do call:jdate JD "%%a")
    ( ENDLOCAL & REM RETURN VALUES
        IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
    )
    EXIT /b
    
    
    :jdate JD DateStr -- converts a date string to julian day number with respect to regional date format
    ::                -- JD      [out,opt] - julian days
    ::                -- DateStr [in,opt]  - date string, e.g. "03/31/2006" or "Fri 03/31/2006" or "31.3.2006"
    :$reference http://groups.google.com/group/alt.msdos.batch.nt/browse_frm/thread/a0c34d593e782e94/50ed3430b6446af8#50ed3430b6446af8
    :$created 20060101 :$changed 20080219 :$changed 20110316
    :$source http://www.dostips.com :$Modified by Cleptography
    SETLOCAL
    set DateStr=%~2&if "%~2"=="" set DateStr=%date%
    for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('"echo.|date"') do (
        for /f "tokens=1-3 delims=/.- " %%A in ("%DateStr:* =%") do (
            set %%a=%%A&set %%b=%%B&set %%c=%%C))
    set /a "yy=10000%yy% %%10000,mm=100%mm% %% 100,dd=100%dd% %% 100"
    set /a JD=dd-32075+1461*(yy+4800+(mm-14)/12)/4+367*(mm-2-(mm-14)/12*12)/12-3*((yy+4900+(mm-14)/12)/100)/4
    ENDLOCAL & IF "%~1" NEQ "" (SET %~1=%JD%) ELSE (echo.%JD%)
    EXIT /b
     
  2. beau710

    beau710 New Member

    Joined:
    Mar 21, 2011
    Messages:
    1
    Likes Received:
    0
    Trophy Points:
    0
    Thanks for sharing your idea here. I appreciate your idea, very excellent.
     

Share This Page