Fab
Fab

Reputation: 4657

Delete all files inside all folders with a specific name with date before today

In my hard disk I have the following structure:

ROOTFOLDER   
├───FOLDER1
│   └───TMPFOLDER
│       ├───FOLDERTODELETE1
│       ├───FOLDERTODELETE2
│       └───FOLDERTODELETE3
├───FOLDER2
│   └───TMPFOLDER
│       ├───FOLDERTODELETE4
│       └───FOLDERTODELETE5
└───FOLDER3
    └───TMPFOLDER
        ├───FOLDERTODELETE6
        ├───FOLDERTODELETE7
        └───FOLDERTODELETE8

I need to create a kind of script (I was thinking about a batch file, but any other solution will be appreciated) to delete all folders within each folders with a specific name (in this case TMPFOLDER) and created before today.

Upvotes: 0

Views: 237

Answers (2)

Andre Kampling
Andre Kampling

Reputation: 5631

Following to your needs the batch script below will do what you need. Remove the echo in front of the rmdir command if it's okay for you. Take care that the script uses the current working directory. Remove /q if you want to be asked for each directory that should be deleted:

@echo off

set "tmpfolder=TMPFOLDER"

for /f "tokens=*" %%D in ('dir /b /a:d "*"') do (
   for /f "tokens=*" %%E in ('dir /b /a:d "%%D\*" ^| findstr /l /x %tmpfolder%') do (
      echo Found temp folder: "%%D\%%E"
      for /f "tokens=*" %%F in ('dir /b /a:d "%%D\%%E\*"') do (
         echo rmdir /s /q "%%D\%%E\%%F"
      )
   )
)

Edit #1:

The above script does not take care of the creation date of the folder that should be removed. You want only folders to be deleted which have a creation date before today. The following script takes care of that. Look here how to get dates of folder and here how to compare dates:

@echo off
setlocal EnableDelayedExpansion

set "tmpfolder=TMPFOLDER"

for /f "tokens=*" %%D in ('dir /b /a:d "*"') do (
   for /f "tokens=*" %%E in ('dir /b /a:d "%%D\*" ^| findstr /x /c:"%tmpfolder%"') do (
      rem echo Found temp folder: "%%D\%%E"
      for /f "tokens=*" %%F in ('dir /b /a:d "%%D\%%E\*"') do (
         rem echo    Subfolder: "%%F"
         set "curdate=!date!"
         set "dirdate="
         echo GETDATE
         call :getdate dirdate "%%D\%%E\%%F"
         set "dirdate=!dirdate:~-4!!dirdate:~3,2!!dirdate:~0,2!"
         set "curdate=!curdate:~-4!!curdate:~3,2!!curdate:~0,2!"

         rem echo    dirdate: "!dirdate!"
         rem echo    curdate: "!curdate!"
         rem echo.

         if [!dirdate!] LSS [!curdate!] (
            echo rmdir /s /q "%%D\%%E\%%F"
         )
      )
   )
)
goto :EOF

:getdate
rem call: getdate date(dstParam) folder(srcParam)
for /f "skip=5 tokens=1 delims= " %%A in ('dir /a:d /o:d /t:c "%~2"') do (
   set "%~1=%%A"
   goto :EOF
)

Command reference links from ss64.com:

Upvotes: 1

Compo
Compo

Reputation: 38589

Although an answer has already been accepted, I have decided to post this untested idea as an alternative:

@Echo Off
SetLocal EnableDelayedExpansion

For /F "Delims=" %%A In ('WMIC OS Get LocalDateTime') Do For %%B In (%%~nA
) Do Set "TD=%%B" & Set "TD=!TD:~,8!"

For /D /R "ROOTFOLDER" %%A In ("TMPFOLD?R") Do If /I "%%~nxA"=="TMPFOLDER" (
    Set "FP=%%~pA" & Set "FP=!FP:\=\\!"
    WMIC FSDir Where "Path='!FP!' And FileName='TMPFOLDER'" Get CreationDate^
     |FindStr/B "%TD%">Nul||Echo=RD/S/Q "%%A")
Timeout -1

You may need to change ROOTFOLDER and all instances of TMPFOLDER as necessary, remembering to use a ? to replace one of the characters in the first instance of TMPFOLDER.

If the output appears to be correct, remove the last line and Echo= from the line above it.

Upvotes: 1

Related Questions